.Net使用NPOI实现在Excel第一行插入文字
产品提出新需求,要在用户所有上传的订单附件中的最前方加入订单号,本以为是小需求,结果确意外的踩了不少坑,下面说一下我踩坑的全部过程:
1.使用CreateRow创建行
最开始的预期是CreateRow(0)就可以完全实现这个小需求了,结果没想到的是,我们的需求是创建新行的同时,其他所有内容下移,CreateRow只能在所在位置创建行,如果该行有内容,将被替换。
2.使用CopyRow复制行再编辑
理想很丰满,显示却很骨感,复制是复制下来了,但是如果第一行是两行合并的话,那就复制了个寂寞,依然会把第一行替换掉。
3.使用ShiftRows移动
ShiftRows方法可以将当前行下移,之前考虑不周,只移动一行,发现会把下一行覆盖就pass了,结果走投无路后回想起来才发现自己是多么的愚蠢。将整个表格的内容全部下移不就可以了吗,最后操作下来证明这个思路是可行的。
ShiftRows参数说明:
startRow开始行
endRow结束行
n下移的行数
copyRowHeight复制行高 (感觉不好用)
resetOriginalRowHeight重置行高
/// <summary>
/// 向Excel插入行
/// </summary>
/// <param name="filePath">文件绝对路径</param>
/// <param name="content">插入内容</param>
public void AddHeadInfo(string filePath, string content)
{
string fileExt = Path.GetExtension(filePath).ToLower();//获取扩展名
IWorkbook workbook;
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(fs); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(fs); } else { workbook = null; }
if (workbook == null) { return; }
ISheet sheet = workbook.GetSheetAt(0);
//将表格内容整体下移
sheet.ShiftRows(0, sheet.LastRowNum, 1);
var newrow = sheet.CreateRow(0);
newrow.CreateCell(0);
newrow.Cells[0].SetCellValue(content);
IFont font = workbook.CreateFont();//创建字体样式
font.Color = HSSFColor.Red.Index;//设置字体颜色
if (fileExt == ".xlsx")
{
newrow.HeightInPoints = 20;
font.FontHeight = 14;
}
else
{
newrow.HeightInPoints = 20;
font.FontHeight = 280;
}
ICellStyle style = workbook.CreateCellStyle();//创建单元格样式
style.SetFont(font);//设置单元格样式中的字体样式
newrow.Cells[0].CellStyle = style;//为单元格设置显示样式
FileStream out2 = new FileStream(filePath, FileMode.Create);
workbook.Write(out2);
out2.Close();
}
}