当前位置 : 主页 > 编程语言 > 其它开发 >

C# 借助NPOI 完成 xls 转换为xlsx

来源:互联网 收集:自由互联 发布时间:2022-05-30
C# excel xls 转 xlsx 保存 背景:MinExcel开源类库,导数据的库,占用内存很低,通过io,不通过内存保存,不支持 xls格式的文件,支持csv和xlsx,所以要想使用这个库,就得把xls格式转换为
C# excel xls 转 xlsx 保存 背景:MinExcel开源类库,导数据的库,占用内存很低,通过io,不通过内存保存,不支持 xls格式的文件,支持csv和xlsx,所以要想使用这个库,就得把xls格式转换为xlsx。只复制了数据 合并单元格,没复制格式这些。
public string ConvertToXlsx(string xlsPath, string newExcelPath)
        {
            var oldWorkbook = new HSSFWorkbook(new FileStream(xlsPath, FileMode.Open));
            var oldWorkSheet = oldWorkbook.GetSheetAt(0);
            int m = 0;
   
            try
            {


                using (var fileStream = new FileStream(newExcelPath, FileMode.Create))
                {
                    var newWorkBook = new XSSFWorkbook();
                    var newWorkSheet = newWorkBook.CreateSheet("Sheet1");
                    int i = 0;
                    foreach (HSSFRow oldRow in oldWorkSheet)
                    {
                       

                        var newRow = newWorkSheet.CreateRow(oldRow.RowNum);

                        for (int ii = oldRow.FirstCellNum; ii < oldRow.Cells.Count; ii++)
                        {
                            m = ii;
                            var newCell = newRow.CreateCell(ii);
                            newCell.SetCellValue(GetValueType(oldRow.Cells[ii]).ToString());
                        }

                     

                    }

                    int sheetMergerCount = oldWorkSheet.NumMergedRegions;
                    for (int me = 0; me < sheetMergerCount; me++)
                        newWorkSheet.AddMergedRegion(oldWorkSheet.GetMergedRegion(me));


                    newWorkBook.Write(fileStream);
                    newWorkBook.Close();
                }
            }
            catch (Exception ex)
            {
                int b = m;
                throw;
            }
            oldWorkbook.Close();

            return newExcelPath;
        }
网上找的一个更完善的用法,带格式:
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FixtureDataImportFromExcel.Common
{
    public static class NPOIExt
    {
        /// <summary>
        /// 跨工作薄Workbook复制工作表Sheet
        /// </summary>
        /// <param name="sSheet">源工作表Sheet</param>
        /// <param name="dWb">目标工作薄Workbook</param>
        /// <param name="dSheetName">目标工作表Sheet名</param>
        /// <param name="clonePrintSetup">是否复制打印设置</param>
        public static ISheet CrossCloneSheet(this ISheet sSheet, IWorkbook dWb, string dSheetName, bool clonePrintSetup)
        {
            ISheet dSheet;
            dSheetName = string.IsNullOrEmpty(dSheetName) ? sSheet.SheetName : dSheetName;
            dSheetName = (dWb.GetSheet(dSheetName) == null) ? dSheetName : dSheetName + "_拷贝";
            dSheet = dWb.GetSheet(dSheetName) ?? dWb.CreateSheet(dSheetName);
            CopySheet(sSheet, dSheet);
            if (clonePrintSetup)
                ClonePrintSetup(sSheet, dSheet);
            dWb.SetActiveSheet(dWb.GetSheetIndex(dSheet));  //当前Sheet作为下次打开默认Sheet
            return dSheet;
        }
        /// <summary>
        /// 跨工作薄Workbook复制工作表Sheet
        /// </summary>
        /// <param name="sSheet">源工作表Sheet</param>
        /// <param name="dWb">目标工作薄Workbook</param>
        /// <param name="dSheetName">目标工作表Sheet名</param>
        public static ISheet CrossCloneSheet(this ISheet sSheet, IWorkbook dWb, string dSheetName)
        {
            bool clonePrintSetup = true;
            return CrossCloneSheet(sSheet, dWb, dSheetName, clonePrintSetup);
        }
        /// <summary>
        /// 跨工作薄Workbook复制工作表Sheet
        /// </summary>
        /// <param name="sSheet">源工作表Sheet</param>
        /// <param name="dWb">目标工作薄Workbook</param>
        public static ISheet CrossCloneSheet(this ISheet sSheet, IWorkbook dWb)
        {
            string dSheetName = sSheet.SheetName;
            bool clonePrintSetup = true;
            return CrossCloneSheet(sSheet, dWb, dSheetName, clonePrintSetup);
        }

        private static IFont FindFont(this IWorkbook dWb, IFont font, List<IFont> dFonts)
        {
            //IFont dFont = dWb.FindFont(font.Boldweight, font.Color, (short)font.FontHeight, font.FontName, font.IsItalic, font.IsStrikeout, font.TypeOffset, font.Underline);
            IFont dFont = null;
            foreach (IFont currFont in dFonts)
            {
                //if (currFont.Charset != font.Charset) continue;
                //else
                //if (currFont.Color != font.Color) continue;
                //else
                if (currFont.FontName != font.FontName) continue;
                else if (currFont.FontHeight != font.FontHeight) continue;
                else if (currFont.IsBold != font.IsBold) continue;
                else if (currFont.IsItalic != font.IsItalic) continue;
                else if (currFont.IsStrikeout != font.IsStrikeout) continue;
                else if (currFont.Underline != font.Underline) continue;
                else if (currFont.TypeOffset != font.TypeOffset) continue;
                else { dFont = currFont; break; }
            }
            return dFont;
        }
        private static ICellStyle FindStyle(this IWorkbook dWb, IWorkbook sWb, ICellStyle style, List<ICellStyle> dCellStyles, List<IFont> dFonts)
        {
            ICellStyle dStyle = null;
            foreach (ICellStyle currStyle in dCellStyles)
            {
                if (currStyle.Alignment != style.Alignment) continue;
                else if (currStyle.VerticalAlignment != style.VerticalAlignment) continue;
                else if (currStyle.BorderTop != style.BorderTop) continue;
                else if (currStyle.BorderBottom != style.BorderBottom) continue;
                else if (currStyle.BorderLeft != style.BorderLeft) continue;
                else if (currStyle.BorderRight != style.BorderRight) continue;
                else if (currStyle.TopBorderColor != style.TopBorderColor) continue;
                else if (currStyle.BottomBorderColor != style.BottomBorderColor) continue;
                else if (currStyle.LeftBorderColor != style.LeftBorderColor) continue;
                else if (currStyle.RightBorderColor != style.RightBorderColor) continue;
                //else if (currStyle.BorderDiagonal != style.BorderDiagonal) continue;
                //else if (currStyle.BorderDiagonalColor != style.BorderDiagonalColor) continue;
                //else if (currStyle.BorderDiagonalLineStyle != style.BorderDiagonalLineStyle) continue;
                //else if (currStyle.FillBackgroundColor != style.FillBackgroundColor) continue;
                //else if (currStyle.FillBackgroundColorColor != style.FillBackgroundColorColor) continue;
                //else if (currStyle.FillForegroundColor != style.FillForegroundColor) continue;
                //else if (currStyle.FillForegroundColorColor != style.FillForegroundColorColor) continue;
                //else if (currStyle.FillPattern != style.FillPattern) continue;
                else if (currStyle.Indention != style.Indention) continue;
                else if (currStyle.IsHidden != style.IsHidden) continue;
                else if (currStyle.IsLocked != style.IsLocked) continue;
                else if (currStyle.Rotation != style.Rotation) continue;
                else if (currStyle.ShrinkToFit != style.ShrinkToFit) continue;
                else if (currStyle.WrapText != style.WrapText) continue;
                else if (!currStyle.GetDataFormatString().Equals(style.GetDataFormatString())) continue;
                else
                {
                    IFont sFont = sWb.GetFontAt(style.FontIndex);
                    IFont dFont = dWb.FindFont(sFont, dFonts);
                    if (dFont == null) continue;
                    else
                    {
                        currStyle.SetFont(dFont);
                        dStyle = currStyle;
                        break;
                    }
                }
            }
            return dStyle;
        }
        private static IFont CopyFont(this IFont dFont, IFont sFont, List<IFont> dFonts)
        {
            //dFont.Charset = sFont.Charset;
            //dFont.Color = sFont.Color;
            dFont.FontHeight = sFont.FontHeight;
            dFont.FontName = sFont.FontName;
            dFont.IsBold = sFont.IsBold;
            dFont.IsItalic = sFont.IsItalic;
            dFont.IsStrikeout = sFont.IsStrikeout;
            dFont.Underline = sFont.Underline;
            dFont.TypeOffset = sFont.TypeOffset;
            dFonts.Add(dFont);
            return dFont;
        }
        private static ICellStyle CopyStyle(this ICellStyle dCellStyle, ICellStyle sCellStyle, IWorkbook dWb, IWorkbook sWb, List<ICellStyle> dCellStyles, List<IFont> dFonts)
        {
            ICellStyle currCellStyle = dCellStyle;
            currCellStyle.Alignment = sCellStyle.Alignment;
            currCellStyle.VerticalAlignment = sCellStyle.VerticalAlignment;
            currCellStyle.BorderTop = sCellStyle.BorderTop;
            currCellStyle.BorderBottom = sCellStyle.BorderBottom;
            currCellStyle.BorderLeft = sCellStyle.BorderLeft;
            currCellStyle.BorderRight = sCellStyle.BorderRight;
            currCellStyle.TopBorderColor = sCellStyle.TopBorderColor;
            currCellStyle.LeftBorderColor = sCellStyle.LeftBorderColor;
            currCellStyle.RightBorderColor = sCellStyle.RightBorderColor;
            currCellStyle.BottomBorderColor = sCellStyle.BottomBorderColor;
            //dCellStyle.BorderDiagonal = sCellStyle.BorderDiagonal;
            //dCellStyle.BorderDiagonalColor = sCellStyle.BorderDiagonalColor;
            //dCellStyle.BorderDiagonalLineStyle = sCellStyle.BorderDiagonalLineStyle;
            //dCellStyle.FillBackgroundColor = sCellStyle.FillBackgroundColor;
            dCellStyle.FillForegroundColor = sCellStyle.FillForegroundColor;
            //dCellStyle.FillPattern = sCellStyle.FillPattern;
            currCellStyle.Indention = sCellStyle.Indention;
            currCellStyle.IsHidden = sCellStyle.IsHidden;
            currCellStyle.IsLocked = sCellStyle.IsLocked;
            currCellStyle.Rotation = sCellStyle.Rotation;
            currCellStyle.ShrinkToFit = sCellStyle.ShrinkToFit;
            currCellStyle.WrapText = sCellStyle.WrapText;
            currCellStyle.DataFormat = dWb.CreateDataFormat().GetFormat(sWb.CreateDataFormat().GetFormat(sCellStyle.DataFormat));
            IFont sFont = sCellStyle.GetFont(sWb);
            IFont dFont = dWb.FindFont(sFont, dFonts) ?? dWb.CreateFont().CopyFont(sFont, dFonts);
            currCellStyle.SetFont(dFont);
            dCellStyles.Add(currCellStyle);
            return currCellStyle;
        }

        private static void CopySheet(ISheet sSheet, ISheet dSheet)
        {
            var maxColumnNum = 0;
            List<ICellStyle> dCellStyles = new List<ICellStyle>();
            List<IFont> dFonts = new List<IFont>();
            MergerRegion(sSheet, dSheet);
            for (int i = sSheet.FirstRowNum; i <= sSheet.LastRowNum; i++)
            {
                IRow sRow = sSheet.GetRow(i);
                IRow dRow = dSheet.CreateRow(i);
                if (sRow != null)
                {
                    CopyRow(sRow, dRow, dCellStyles, dFonts);
                    if (sRow.LastCellNum > maxColumnNum)
                        maxColumnNum = sRow.LastCellNum;
                }
            }
            for (int i = 0; i <= maxColumnNum; i++)
                dSheet.SetColumnWidth(i, sSheet.GetColumnWidth(i));
        }
        private static void CopyRow(IRow sRow, IRow dRow, List<ICellStyle> dCellStyles, List<IFont> dFonts)
        {
            dRow.Height = sRow.Height;
            ISheet sSheet = sRow.Sheet;
            ISheet dSheet = dRow.Sheet;
            for (int j = sRow.FirstCellNum; j <= sRow.LastCellNum; j++)
            {
                NPOI.SS.UserModel.ICell sCell = sRow.GetCell(j);
                NPOI.SS.UserModel.ICell dCell = dRow.GetCell(j);
                if (sCell != null)
                {
                    if (dCell == null)
                        dCell = dRow.CreateCell(j);
                    CopyCell(sCell, dCell, dCellStyles, dFonts);
                }
            }
        }
        private static void CopyCell(NPOI.SS.UserModel.ICell sCell, NPOI.SS.UserModel.ICell dCell, List<ICellStyle> dCellStyles, List<IFont> dFonts)
        {
            ICellStyle currCellStyle = dCell.Sheet.Workbook.FindStyle(sCell.Sheet.Workbook, sCell.CellStyle, dCellStyles, dFonts);
            if (currCellStyle == null)
                currCellStyle = dCell.Sheet.Workbook.CreateCellStyle().CopyStyle(sCell.CellStyle, dCell.Sheet.Workbook, sCell.Sheet.Workbook, dCellStyles, dFonts);
            dCell.CellStyle = currCellStyle;
            switch (sCell.CellType)
            {
                case CellType.String:
                    dCell.SetCellValue(sCell.StringCellValue);
                    break;
                case CellType.Numeric:
                    dCell.SetCellValue(sCell.NumericCellValue);
                    break;
                case CellType.Blank:
                    dCell.SetCellType(CellType.Blank);
                    break;
                case CellType.Boolean:
                    dCell.SetCellValue(sCell.BooleanCellValue);
                    break;
                case CellType.Error:
                    dCell.SetCellValue(sCell.ErrorCellValue);
                    break;
                case CellType.Formula:
                    dCell.SetCellFormula(sCell.CellFormula);
                    break;
                default:
                    break;
            }
        }

        private static void MergerRegion(ISheet sSheet, ISheet dSheet)
        {
            int sheetMergerCount = sSheet.NumMergedRegions;
            for (int i = 0; i < sheetMergerCount; i++)
                dSheet.AddMergedRegion(sSheet.GetMergedRegion(i));
        }
        private static void ClonePrintSetup(ISheet sSheet, ISheet dSheet)
        {
            //工作表Sheet页面打印设置
            dSheet.PrintSetup.Copies = 1;                               //打印份数
            dSheet.PrintSetup.PaperSize = sSheet.PrintSetup.PaperSize;  //纸张大小
            dSheet.PrintSetup.Landscape = sSheet.PrintSetup.Landscape;  //纸张方向:默认纵向false(横向true)
            dSheet.PrintSetup.Scale = sSheet.PrintSetup.Scale;          //缩放方式比例
            dSheet.PrintSetup.FitHeight = sSheet.PrintSetup.FitHeight;  //调整方式页高
            dSheet.PrintSetup.FitWidth = sSheet.PrintSetup.FitWidth;    //调整方式页宽
            dSheet.PrintSetup.FooterMargin = sSheet.PrintSetup.FooterMargin;
            dSheet.PrintSetup.HeaderMargin = sSheet.PrintSetup.HeaderMargin;
            //页边距
            dSheet.SetMargin(MarginType.TopMargin, sSheet.GetMargin(MarginType.TopMargin));
            dSheet.SetMargin(MarginType.BottomMargin, sSheet.GetMargin(MarginType.BottomMargin));
            dSheet.SetMargin(MarginType.LeftMargin, sSheet.GetMargin(MarginType.LeftMargin));
            dSheet.SetMargin(MarginType.RightMargin, sSheet.GetMargin(MarginType.RightMargin));
            dSheet.SetMargin(MarginType.HeaderMargin, sSheet.GetMargin(MarginType.HeaderMargin));
            dSheet.SetMargin(MarginType.FooterMargin, sSheet.GetMargin(MarginType.FooterMargin));
            //页眉页脚
            dSheet.Header.Left = sSheet.Header.Left;
            dSheet.Header.Center = sSheet.Header.Center;
            dSheet.Header.Right = sSheet.Header.Right;
            dSheet.Footer.Left = sSheet.Footer.Left;
            dSheet.Footer.Center = sSheet.Footer.Center;
            dSheet.Footer.Right = sSheet.Footer.Right;
            //工作表Sheet参数设置
            dSheet.IsPrintGridlines = sSheet.IsPrintGridlines;          //true: 打印整表网格线。不单独设置CellStyle时外框实线内框虚线。 false: 自己设置网格线
            dSheet.FitToPage = sSheet.FitToPage;                        //自适应页面
            dSheet.HorizontallyCenter = sSheet.HorizontallyCenter;      //打印页面为水平居中
            dSheet.VerticallyCenter = sSheet.VerticallyCenter;          //打印页面为垂直居中
            dSheet.RepeatingRows = sSheet.RepeatingRows;                //工作表顶端标题行范围
        }
    }
}
View Code

使用:

using (var fileStream = new FileStream(newExcelPath, FileMode.Create))
            {
                var newWorkBook1 = new XSSFWorkbook();
                var sheet = oldWorkSheet.CrossCloneSheet(newWorkBook1, "Sheet1");
                newWorkBook1.Add(sheet);
                newWorkBook1.Write(fileStream);
                newWorkBook1.Close();

            }
                oldWorkbook.Close();
大部分格式都得行 这个类的原文地址: C# NPOI Excel 跨工作薄Workbook复制工作表Sheet
上一篇:JS获取Cookie失败
下一篇:没有了
网友评论