虽然NPOI中没有提示现有的插入行函数,但我们可以写一个类似效果的函数:
这里用到了NPOI中自带的ShiftRows函数,该函数功能:对指定行移动操作
public void ShiftRows(int startRow, int endRow, int n);
public void ShiftRows(int startRow, int endRow, int n, bool copyRowHeight, bool resetOriginalRowHeight);
public void ShiftRows(int startRow, int endRow, int n, bool copyRowHeight, bool resetOriginalRowHeight, bool moveComments);
思路:
一:先确要从第几行插入—-int InsertRowIndex;
二:指定要插入多少行—-int InsertRowCount;
三:指定InsertRowIndex上面那行—-HSSFRow mySourceStyleRow,并获取他的格式:
获取InsertRowIndex上面那行的方法:InsertRowIndex-1.
打开一个Workbook 可以用到函数NPOIOpenExcel(string fileName);
获取行:
HSSFSheet mySheet= Workbook.GetSheetAt(Workbook.ActiveSheetIndex);
HSSFRow mySourceStyleRow=mySheet.GetRow(InsertRowIndex-1);
四:对InsertRowIndex那一行开始到最后一行:HSSFSheet类下的属性.LastRowNum(获取最后有效的行数)都批量用ShiftRows函数往下移动InsertRowCount行,这时会在第InsertRowIndex行里,出现了InsertRowCount行空行,这里只要对空行的格式都设置为mySourceStyleRow行的格式的每一个相应的单元格格式即可
这里用到函数 MyInsertRow()即可
示例,假如我要在指定的表的第3行插入3行,可以使用这样写:
int InsertRowIndex=2;//指定在第几行插入,我们这里测试用第3行,对应NPOI的索引值2,因为从0起
int InsertRowCount=3;//要插入的行数
HSSFWorkbook Workbook=NPOIOpenExcel(@”E:\TEST\MyExcelTestFile.xls”);//打开工作薄
HSSFSheet mySheet= Workbook.GetSheetAt(Workbook.ActiveSheetIndex);//获取工作表
HSSFRow mySourceStyleRow=mySheet.GetRow(InsertRowIndex-1);//获取源格式行
//调用插入行方法
MyInsertRow(mySheet,InsertRowIndex,InsertRowCount,mySourceStyleRow);
//参数说明
//第一个:指定操作的Sheet。
//第二个:指定在第几行指入(插入行的位置)
//第三个:指定要插入多少行
//第四个:源单元格格式的行,
函数部分:
public HSSFWorkbook NPOIOpenExcel(string FileName)
{
HSSFWorkbook MyHSSFWorkBook;
Stream MyExcelStream = OpenClasspathResource(FileName);
MyHSSFWorkBook = new HSSFWorkbook(MyExcelStream);
return MyHSSFWorkBook;
}
private void MyInsertRow(HSSFSheet sheet, int 插入行, int 插入行总数, HSSFRow 源格式行)
{
#region 批量移动行
sheet
.ShiftRows
(
插入行, //–开始行
sheet
.LastRowNum, //–结束行
插入行总数, //–移动大小(行数)–往下移动
true, //是否复制行高
false, //是否重置行高
true //是否移动批注
);
#endregion
#region 对批量移动后空出的空行插,创建相应的行,并以插入行的上一行为格式源(即:插入行-1的那一行)
for (int i = 插入行; i < 插入行 + 插入行总数 – 1; i++)
{
HSSFRow targetRow = null;
HSSFCell sourceCell = null;
HSSFCell targetCell = null;
targetRow = sheet.CreateRow(i + 1);
for (int m = 源格式行.FirstCellNum; m < 源格式行.LastCellNum; m++)
{
sourceCell = 源格式行.GetCell(m);
if (sourceCell == null)
continue;
targetCell = targetRow.CreateCell(m);
targetCell.Encoding = sourceCell.Encoding;
targetCell.CellStyle = sourceCell.CellStyle;
targetCell.SetCellType(sourceCell.CellType);
}
//CopyRow(sourceRow, targetRow);
//Util.CopyRow(sheet, sourceRow, targetRow);
}
HSSFRow firstTargetRow = sheet.GetRow(插入行);
HSSFCell firstSourceCell = null;
HSSFCell firstTargetCell = null;
for (int m = 源格式行.FirstCellNum; m < 源格式行.LastCellNum; m++)
{
firstSourceCell = 源格式行.GetCell(m);
if (firstSourceCell == null)
continue;
firstTargetCell = firstTargetRow.CreateCell(m);
firstTargetCell.Encoding = firstSourceCell.Encoding;
firstTargetCell.CellStyle = firstSourceCell.CellStyle;
firstTargetCell.SetCellType(firstSourceCell.CellType);
}
#endregion
}