NPOI中如何复制Sheet

来源:互联网 发布:浏览器域名劫持 编辑:程序博客网 时间:2024/05/29 16:47

NPOI已经发布到了2.0的版本,可喜的是该版本支持到了Excel2007,但缺憾的是没有复制SHEET表的功能,只有一个CloneSheet方法,确实没明白怎么使用。所以在网上搜索了一下,只找一个JAVA的版本,好像也是自己写的代码实现的。于是拿过来翻译了一下,复制SHEET后的格式基本没变,但单元格的宽度没有实现,ICell接口没有类似于Width的属性,只好作罢。

哪位如果知道CloneSheet方法的使用,恳请留言,免去不必要的操作和代码。

 

public class SheetClone    {        public static void 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 static void 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 static void 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 static void 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 static void 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                }            }        }    }