NPOI 插入行[转]

虽然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
        }

出自http://hi.baidu.com/linrao/creat/blog/Npoi

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注