在创建Excel文件时,如何使用OpenXml向单元格添加文本换行?

时间:2015-02-17 17:52:05

标签: c# asp.net excel openxml

如何使用OpenXml生成.xlsx文件时设置要包装的文本单元格的格式?这是我目前的代码:

public void Excel()
    {
        var viewModel = new RequirementIndexData();
        viewModel.Requirements = db.Requirement;

        MemoryStream ms = new MemoryStream();

        SpreadsheetDocument dc = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook);

        WorkbookPart mdp = dc.AddWorkbookPart();
        WorksheetPart wsp = mdp.AddNewPart<WorksheetPart>();
        Workbook wb = new Workbook();
        FileVersion fv = new FileVersion();
        fv.ApplicationName = "Microsoft Office Excel";
        Worksheet ws = new Worksheet();

        SheetData sd = new SheetData();

        Columns columns = new Columns();
        columns.Append(CreateColumnData(1, 1, 95));
        ws.Append(columns);


        Row r1 = new Row() { RowIndex = (UInt32Value)1u };

        Cell c1 = new Cell();
        c1.DataType = CellValues.SharedString;
        c1.CellValue = new CellValue(OpenSoft.AgileAnalytics.EF.App_LocalResources.GlobalRes.VersionNumber + " " + viewModel.Requirements.OrderBy(r => r.CreatedOn).Select(r => r.CurentVersion).First().ToString());

        r1.Append(c1);
        sd.Append(r1);

        for (int i = 2; i < viewModel.Requirements.Count() + 2; i++)
        {
            Row row2;
            row2 = new Row()
            {
                RowIndex = (UInt32)i,

                Height = 25,
                DyDescent = 1.50D,
                Hidden = false,
                Collapsed = false
            };
            Cell cell2 = new Cell() { StyleIndex = Convert.ToUInt32(1) };
            cell2.DataType = CellValues.SharedString;
            cell2.CellValue = new CellValue((i - 1).ToString() + ". " + viewModel.Requirements.OrderBy(r => r.CreatedOn).Select(r => r.Definition).ElementAt(i - 2).ToString());

            row2.Append(cell2);
            sd.Append(row2);
        }

        ws.Append(sd);
        wsp.Worksheet = ws;
        wsp.Worksheet.Save();
        Sheets sheets = new Sheets();
        Sheet sheet = new Sheet();
        sheet.Name = "specification1";
        sheet.SheetId = 1;
        sheet.Id = mdp.GetIdOfPart(wsp);
        sheets.Append(sheet);
        wb.Append(fv);
        wb.Append(sheets);            

        dc.WorkbookPart.Workbook = wb;
        dc.WorkbookPart.Workbook.Save();
        dc.Close();
        string filename = "specification1.xlsx";
        Response.Clear();
        byte[] dt = ms.ToArray();

        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename));
        Response.BinaryWrite(dt);
        Response.End();
    }

    private WorkbookStylesPart AddStyleSheet(SpreadsheetDocument spreadsheet)
    {
        WorkbookStylesPart stylesheet = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();

        Stylesheet workbookstylesheet = new Stylesheet();

        // <Fonts>
        Font font0 = new Font();         // Default font

        Fonts fonts = new Fonts();      // <APENDING Fonts>
        fonts.Append(font0);

        // <Fills>
        Fill fill0 = new Fill();        // Default fill

        Fills fills = new Fills();      // <APENDING Fills>
        fills.Append(fill0);

        // <Borders>
        Border border0 = new Border();     // Defualt border

        Borders borders = new Borders();    // <APENDING Borders>
        borders.Append(border0);

        // <CellFormats>
        CellFormat cellformat0 = new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 }; // Default style : Mandatory

        CellFormat cellformat1 = new CellFormat(new Alignment() { WrapText = true }); // Style with textwrap set


        // <APENDING CellFormats>
        CellFormats cellformats = new CellFormats();
        cellformats.Append(cellformat0);
        cellformats.Append(cellformat1);


        // Append FONTS, FILLS , BORDERS & CellFormats to stylesheet <Preserve the ORDER>
        workbookstylesheet.Append(fonts);
        workbookstylesheet.Append(fills);
        workbookstylesheet.Append(borders);
        workbookstylesheet.Append(cellformats);

        // Finalize
        stylesheet.Stylesheet = workbookstylesheet;
        stylesheet.Stylesheet.Save();

        return stylesheet;
    }

2 个答案:

答案 0 :(得分:13)

您需要为此定义样式。样式在样式表中定义。每种样式都有一个ID,当您创建单元格时,您可以引用已定义的样式ID。

将样式表定义为电子表格:

 private WorkbookStylesPart AddStyleSheet(SpreadsheetDocument spreadsheet)
 {
       WorkbookStylesPart stylesheet = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();

       Stylesheet workbookstylesheet = new Stylesheet();

       // <Fonts>
       Font font0 = new Font();         // Default font

       Fonts fonts = new Fonts();      // <APENDING Fonts>
       fonts.Append(font0);

       // <Fills>
       Fill fill0 = new Fill();        // Default fill

       Fills fills = new Fills();      // <APENDING Fills>
       fills.Append(fill0);

       // <Borders>
       Border border0 = new Border();     // Defualt border

       Borders borders = new Borders();    // <APENDING Borders>
       borders.Append(border0);

       // <CellFormats>
        CellFormat cellformat0 = new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 }; // Default style : Mandatory

       CellFormat cellformat1 = new CellFormat(new Alignment() { WrapText=true});  // Style with textwrap set


      // <APENDING CellFormats>
      CellFormats cellformats = new CellFormats();
      cellformats.Append(cellformat0);
      cellformats.Append(cellformat1);


       // Append FONTS, FILLS , BORDERS & CellFormats to stylesheet <Preserve the ORDER>
      workbookstylesheet.Append(fonts);
      workbookstylesheet.Append(fills);
      workbookstylesheet.Append(borders);
      workbookstylesheet.Append(cellformats);

      // Finalize
      stylesheet.Stylesheet = workbookstylesheet;
      stylesheet.Stylesheet.Save();

      return stylesheet;
}

现在,当您添加单元格时,请使用define样式ID,如下所示:

Cell c1 = new Cell(){StyleIndex = Convert.ToUInt32(1)}; // Assign our defined style with text wrap. 

编辑:您需要在添加workbookpart后添加样式表..

答案 1 :(得分:0)

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

//pathToExcel is filename of the existing file
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(pathToExcel, true))
    {
       //Get workbookpart
       WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
       WorkbookStylesPart wbsp = CreateStylesheet(workbookPart.WorkbookStylesPart);
       //then access to the worksheet part
       List<WorksheetPart> worksheetPart = workbookPart.WorksheetParts.ToList();                 
       foreach (WorksheetPart WSP in worksheetPart)
       {                    
           //find sheet data
           IEnumerable<SheetData> sheetData = WSP.Worksheet.Elements<SheetData>();
           //Iterate through every sheet inside Excel sheet                    
           foreach (SheetData SD in sheetData)
           {                         
               IEnumerable<Row> row = SD.Elements<Row>(); // Get the row                                                                    
               int rowindex = 1;
               foreach (Row currentrow in row)
               {
                   foreach (Cell cell in currentrow.Descendants<Cell>())
                   {
                       //Doing Wordwrap in the cell using openxml - in open xml we need to do cell level word wrap
                       cell.StyleIndex = Convert.ToUInt32(1);
                   }
                   //Here Row AutoFit property is not available, setting the row height manually and skipping 1st two rows
                   if (rowindex > 2)
                   {
                       currentrow.Height = currentrow.Height + 5;
                       currentrow.CustomHeight = true;                               
                   }                         
                   rowindex++; 
              }
        }
     WSP.Worksheet.Save();         
 }
 //workbookPart.Workbook.Save();
 spreadsheetDocument.Close();
}

private static WorkbookStylesPart CreateStylesheet(WorkbookStylesPart spreadsheet)
{
   WorkbookStylesPart stylesheet = spreadsheet;
   Stylesheet workbookstylesheet = new Stylesheet(); 
   // <CellFormats>
   CellFormat cellformat0 = new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 }; // Default style : Mandatory
   CellFormat cellformat1 = new CellFormat(new Alignment() { WrapText = true });  
   //Style with textwrap set
   Fills fills = new Fills();
   Fill fill;
   PatternFill patternFill;
   fill = new Fill();
   patternFill = new PatternFill();
   patternFill.PatternType = PatternValues.None;
   fill.PatternFill = patternFill;
   fills.Append(fill);

  //<APENDING CellFormats>
  CellFormats cellformats = new CellFormats();
  cellformats.Append(cellformat0);
  cellformats.Append(cellformat1);

  // Append FONTS, FILLS , BORDERS & CellFormats to stylesheet <Preserve the ORDER>            
   workbookstylesheet.Append(fills);
   workbookstylesheet.Append(cellformats);

   // Finalize
   stylesheet.Stylesheet = workbookstylesheet;
   stylesheet.Stylesheet.Save();

   return stylesheet;
}