以下内容由chocolateboy兄所写,在此仅作为转帖
原文载于:http://blog.csdn.net/chocolateboy/article/details/9705425
NPOI已经发布到了2.0的版本,可喜的是该版本支持到了Excel2007,但缺憾的是没有复制SHEET表的功能,只有一个CloneSheet方法,确实没明白怎么使用。所以在网上搜索了一下,只找一个JAVA的版本,好像也是自己写的代码实现的。于是拿过来翻译了一下,复制SHEET后的格式基本没变,但单元格的宽度没有实现,ICell接口没有类似于Width的属性,只好作罢。
哪位如果知道CloneSheet方法的使用,恳请留言,免去不必要的操作和代码。
- public class SheetClone
- {
- public staticvoid CopyCellStyle(IWorkbook wb, ICellStyle fromStyle, ICellStyle toStyle)
- {
- toStyle.Alignment = fromStyle.Alignment;
- //边框和边框颜色
- toStyle.BorderBottom = fromStyle.BorderBottom;
- toStyle.BorderLeft = fromStyle.BorderLeft;
- toStyle.BorderRight = fromStyle.BorderRight;
- toStyle.BorderTop = fromStyle.BorderTop;
- toStyle.TopBorderColor = fromStyle.TopBorderColor;
- toStyle.BottomBorderColor = fromStyle.BottomBorderColor;
- toStyle.RightBorderColor = fromStyle.RightBorderColor;
- toStyle.LeftBorderColor = fromStyle.LeftBorderColor;
- //背景和前景
- toStyle.FillBackgroundColor = fromStyle.FillBackgroundColor;
- toStyle.FillForegroundColor = fromStyle.FillForegroundColor;
- toStyle.DataFormat = fromStyle.DataFormat;
- toStyle.FillPattern = fromStyle.FillPattern;
- //toStyle.Hidden=fromStyle.Hidden;
- toStyle.IsHidden = fromStyle.IsHidden;
- toStyle.Indention = fromStyle.Indention;//首行缩进
- toStyle.IsLocked = fromStyle.IsLocked;
- toStyle.Rotation = fromStyle.Rotation;//旋转
- toStyle.VerticalAlignment = fromStyle.VerticalAlignment;
- toStyle.WrapText = fromStyle.WrapText;
- toStyle.SetFont(fromStyle.GetFont(wb));
- }
- /// <summary>
- /// 复制表
- /// </summary>
- /// <param name="wb"></param>
- /// <param name="fromSheet"></param>
- /// <param name="toSheet"></param>
- /// <param name="copyValueFlag"></param>
- public staticvoid CopySheet(IWorkbook wb, ISheet fromSheet, ISheet toSheet,bool copyValueFlag)
- {
- //合并区域处理
- MergerRegion(fromSheet, toSheet);
- System.Collections.IEnumerator rows = fromSheet.GetRowEnumerator();
- while (rows.MoveNext())
- {
- IRow row = null;
- if (wb is HSSFWorkbook)
- row = rows.Current as HSSFRow;
- else
- row = rows.Current as NPOI.XSSF.UserModel.XSSFRow;
- IRow newRow = toSheet.CreateRow(row.RowNum);
- CopyRow(wb, row, newRow, copyValueFlag);
- }
- }
- /// <summary>
- /// 复制行
- /// </summary>
- /// <param name="wb"></param>
- /// <param name="fromRow"></param>
- /// <param name="toRow"></param>
- /// <param name="copyValueFlag"></param>
- public staticvoid CopyRow(IWorkbook wb, IRow fromRow, IRow toRow,bool copyValueFlag)
- {
- System.Collections.IEnumerator cells = fromRow.GetEnumerator();//.GetRowEnumerator();
- toRow.Height = fromRow.Height;
- while (cells.MoveNext())
- {
- ICell cell = null;
- //ICell cell = (wb is HSSFWorkbook) ? cells.Current as HSSFCell : cells.Current as NPOI.XSSF.UserModel.XSSFCell;
- if (wb is HSSFWorkbook)
- cell = cells.Current as HSSFCell;
- else
- cell = cells.Current as NPOI.XSSF.UserModel.XSSFCell;
- ICell newCell = toRow.CreateCell(cell.ColumnIndex);
- CopyCell(wb, cell, newCell, copyValueFlag);
- }
- }
- /// <summary>
- /// 复制原有sheet的合并单元格到新创建的sheet
- /// </summary>
- /// <param name="fromSheet"></param>
- /// <param name="toSheet"></param>
- public staticvoid MergerRegion(ISheet fromSheet, ISheet toSheet)
- {
- int sheetMergerCount = fromSheet.NumMergedRegions;
- for (int i = 0; i < sheetMergerCount; i++)
- {
- //Region mergedRegionAt = fromSheet.GetMergedRegion(i); //.MergedRegionAt(i);
- //CellRangeAddress[] cra = new CellRangeAddress[1];
- //cra[0] = fromSheet.GetMergedRegion(i);
- //Region[] rg = Region.ConvertCellRangesToRegions(cra);
- toSheet.AddMergedRegion(fromSheet.GetMergedRegion(i));
- }
- }
- /// <summary>
- /// 复制单元格
- /// </summary>
- /// <param name="wb"></param>
- /// <param name="srcCell"></param>
- /// <param name="distCell"></param>
- /// <param name="copyValueFlag"></param>
- public staticvoid CopyCell(IWorkbook wb, ICell srcCell, ICell distCell,bool copyValueFlag)
- {
- ICellStyle newstyle = wb.CreateCellStyle();
- CopyCellStyle(wb, srcCell.CellStyle, newstyle);
- //样式
- distCell.CellStyle = newstyle;
- //评论
- if (srcCell.CellComment != null)
- {
- distCell.CellComment = srcCell.CellComment;
- }
- // 不同数据类型处理
- CellType srcCellType = srcCell.CellType;
- distCell.SetCellType(srcCellType);
- if (copyValueFlag)
- {
- if (srcCellType == CellType.NUMERIC)
- {
- if (HSSFDateUtil.IsCellDateFormatted(srcCell))
- {
- distCell.SetCellValue(srcCell.DateCellValue);
- }
- else
- {
- distCell.SetCellValue(srcCell.NumericCellValue);
- }
- }
- else if (srcCellType == CellType.STRING)
- {
- distCell.SetCellValue(srcCell.RichStringCellValue);
- }
- else if (srcCellType == CellType.BLANK)
- {
- // nothing21
- }
- else if (srcCellType == CellType.BOOLEAN)
- {
- distCell.SetCellValue(srcCell.BooleanCellValue);
- }
- else if (srcCellType == CellType.ERROR)
- {
- distCell.SetCellErrorValue(srcCell.ErrorCellValue);
- }
- else if (srcCellType == CellType.FORMULA)
- {
- distCell.SetCellFormula(srcCell.CellFormula);
- }
- else
- { // nothing29
- }
- }
- }
- }