虽然NPOI中没有提示现有的插入行函数,但我们可以写一个类似效果的函数:
这里用到了NPOI中自带的ShiftRows函数,该函数功能:对指定行移动操作
public void ShiftRowsint startRow, int endRow, int n);
public void ShiftRowsint startRow, int endRow, int n, bool copyRowHeight, bool resetOriginalRowHeight);
public void ShiftRowsint startRow, int endRow, int n, bool copyRowHeight, bool resetOriginalRowHeight, bool moveComments);
思路:
一:先确要从第几行插入—-int InsertRowIndex;
二:指定要插入多少行—-int InsertRowCount;
三:指定InsertRowIndex上面那行—-HSSFRow mySourceStyleRow,并获取他的格式:
获取InsertRowIndex上面那行的方法:InsertRowIndex-1.
打开一个Workbook 可以用到函数NPOIOpenExcelstring fileName);
获取行:
HSSFSheet mySheet= Workbook.GetSheetAtWorkbook.ActiveSheetIndex);
HSSFRow mySourceStyleRow=mySheet.GetRowInsertRowIndex-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.GetSheetAtWorkbook.ActiveSheetIndex);//获取工作表
HSSFRow mySourceStyleRow=mySheet.GetRowInsertRowIndex-1);//获取源格式行
//调用插入行方法
MyInsertRowmySheet,InsertRowIndex,InsertRowCount,mySourceStyleRow);
//参数说明
//第一个:指定操作的Sheet。
//第二个:指定在第几行指入(插入行的位置)
//第三个:指定要插入多少行
//第四个:源单元格格式的行,
函数部分:
public HSSFWorkbook NPOIOpenExcelstring FileName)
{
HSSFWorkbook MyHSSFWorkBook;
Stream MyExcelStream = OpenClasspathResourceFileName);
MyHSSFWorkBook = new HSSFWorkbookMyExcelStream);
return MyHSSFWorkBook;
}
private void MyInsertRowHSSFSheet 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.CreateRowi + 1);
for int m = 源格式行.FirstCellNum; m < 源格式行.LastCellNum; m++)
{
sourceCell = 源格式行.GetCellm);
if sourceCell == null)
continue;
targetCell = targetRow.CreateCellm);
targetCell.Encoding = sourceCell.Encoding;
targetCell.CellStyle = sourceCell.CellStyle;
targetCell.SetCellTypesourceCell.CellType);
}
//CopyRowsourceRow, targetRow);
//Util.CopyRowsheet, sourceRow, targetRow);
}
HSSFRow firstTargetRow = sheet.GetRow插入行);
HSSFCell firstSourceCell = null;
HSSFCell firstTargetCell = null;
for int m = 源格式行.FirstCellNum; m < 源格式行.LastCellNum; m++)
{
firstSourceCell = 源格式行.GetCellm);
if firstSourceCell == null)
continue;
firstTargetCell = firstTargetRow.CreateCellm);
firstTargetCell.Encoding = firstSourceCell.Encoding;
firstTargetCell.CellStyle = firstSourceCell.CellStyle;
firstTargetCell.SetCellTypefirstSourceCell.CellType);
}
#endregion
}