OpenXml demo

    class OpenXmlDemo
    {
        /*
         * excel 对象结构
         * SpreadsheetDocument
         *   》WorkbookPart
         *       》WorksheetPart
         *           》Worksheet
         *            》SheetData
         *       》WorksheetPart
         *          》Worksheet
         *                》SheetData1
         *       》Workbook
         *           》Sheets
         *                》Sheet
         */
        public static void Create(string path)
        {
            SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook);

            WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
            Workbook workbook = new Workbook();
            Sheets sheets = new Sheets();

            //创建样式

            var workbookStylesPart = workbookpart.AddNewPart<WorkbookStylesPart>();
            Stylesheet stylesheet = new Stylesheet();
            workbookStylesPart.Stylesheet = stylesheet;

            #region 设置字体
            workbookStylesPart.Stylesheet.Fonts = new Fonts()
            {
                Count = (UInt32Value)1U
            };
            Font fontCalibri = new Font(new FontSize() { Val = 11D },
                             new FontName() { Val = "Calibri" },
                             new FontFamily() { Val = 2 },
                             new FontScheme() { Val = FontSchemeValues.Minor });

            stylesheet.Fonts.Append(fontCalibri);

            Font fontCalibri2 = new Font(new FontSize() { Val = 11D },
                            new FontName() { Val = "华文新魏" },
                            new FontCharSet() { Val = 134 }
                            );
            workbookStylesPart.Stylesheet.Fonts.Append(fontCalibri2);

            Font fontCalibri3 = new Font(new FontSize() { Val = 11D },
                            new FontName() { Val = "华文楷体" },
                            new FontCharSet() { Val = 134 }
                            );
            workbookStylesPart.Stylesheet.Fonts.Append(fontCalibri3);
            #endregion
            #region -- 设置边框 --
            stylesheet.Borders = new Borders()
            {
                Count = (UInt32Value)2U
            };

            //borderID=0
            Border borderDefault = new Border(new LeftBorder(), new RightBorder(), new TopBorder() { }, new BottomBorder(), new DiagonalBorder());
            stylesheet.Borders.Append(borderDefault);

            //borderID=1
            Border borderContent = new Border(
                new LeftBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                new RightBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                new TopBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                new BottomBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                new DiagonalBorder()
);
            stylesheet.Borders.Append(borderContent);
            #endregion

            #region 设置填充色
             //fillId,0总是None,1总是gray125,自定义的从fillid =2开始
             stylesheet.Fills = new Fills()
             {
                 Count = (UInt32Value)3U
             };

             //fillid=0
             Fill fillDefault = new Fill(new PatternFill() { PatternType = PatternValues.None });
             stylesheet.Fills.Append(fillDefault);

             //fillid=1
             Fill fillGray = new Fill();
             PatternFill patternFillGray = new PatternFill()
             {
                 PatternType = PatternValues.Gray125
             };
             fillGray.Append(patternFillGray);
             stylesheet.Fills.Append(fillGray);

             //fillid=2
             Fill fillYellow = new Fill();
             PatternFill patternFillYellow = new PatternFill(new ForegroundColor() { Rgb = new HexBinaryValue() { Value = "FFFFFF00" } })
             {
                 PatternType = PatternValues.Solid
             };
             fillYellow.Append(patternFillYellow);
             stylesheet.Fills.Append(fillYellow);

             stylesheet.Borders = new Borders()
             {
                 Count = (UInt32Value)2U
             };
            #endregion
            #region 定义单元格样式
            stylesheet.CellFormats = new CellFormats();
            stylesheet.CellFormats.Count = 2;
            //styleIndex =0U
            CellFormat cfDefault = new CellFormat();
            cfDefault.Alignment = new Alignment();
            cfDefault.NumberFormatId = 0;
            cfDefault.FontId = 0;
            cfDefault.BorderId = 0;
            cfDefault.FillId = 0;
            cfDefault.ApplyAlignment = true;
            cfDefault.ApplyBorder = true;
            stylesheet.CellFormats.Append(cfDefault);

            //styleIndex =1U
            CellFormat cfContent = new CellFormat();
            cfContent.Alignment = new Alignment();
            cfContent.NumberFormatId = 0;
            cfContent.FontId = 0;
            cfContent.BorderId = 1;
            cfContent.FillId = 2;
            cfContent.ApplyAlignment = true;
            cfContent.ApplyBorder = true;
            stylesheet.CellFormats.Append(cfContent);
            #endregion

            #region 创建多个 sheet 页

            //创建多个sheet
            for (int s = 0; s < 2; s++)
            {
                var tname = $"sheet{s + 1}";

                WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
                Worksheet worksheet = new Worksheet();
                SheetData sheetData = new SheetData();

                //创建 sheet 页
                Sheet sheet = new Sheet()
                {
                    //页面关联的 WorksheetPart
                    Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
                    SheetId = UInt32Value.FromUInt32((uint)s + 1),
                    Name = tname
                };
                sheets.Append(sheet);

                #region 创建sheet 行
                Row row;
                uint rowIndex = 1;
                //添加表头
                row = new Row()
                {
                    RowIndex = UInt32Value.FromUInt32(rowIndex++)
                };
                sheetData.Append(row);
                for (int i = 0; i < 3; i++)
                {
                    Cell newCell = new Cell
                    {
                        CellValue = new CellValue($"row{i + 1}"),
                        DataType = new EnumValue<CellValues>(CellValues.String)
                    };
                    row.Append(newCell);
                }
                #endregion

                worksheet.Append(sheetData);
                worksheetPart.Worksheet = worksheet;
                worksheetPart.Worksheet.Save();
            }
            #endregion

            workbook.Append(sheets);
            workbookpart.Workbook = workbook;

            workbookpart.Workbook.Save();
            spreadsheetDocument.Close();
        }
    }

最近用到了OpenXml,但是这真是个很难学习的框架,一不注意,也不给你报错,等生成成功打开的时候才会说格式错误。

目前这个demo还是错误的,后面再学习处理。

Tags: