2015-02-17 17 views
7

Làm thế nào để bạn đặt định dạng của ô văn bản để bọc khi tạo tệp .xlsx bằng OpenXml? Đây là mã tôi hiện có:Làm thế nào để bạn thêm gói văn bản vào một ô bằng cách sử dụng OpenXml khi tạo tệp excel?

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; 
    } 

Trả lời

11

Bạn cần xác định kiểu cho việc này. Kiểu được xác định bên trong một biểu định kiểu. Mỗi kiểu có một ID và khi bạn tạo các ô, bạn có thể tham chiếu ID kiểu đã xác định.

Xác định stylesheet vào bảng tính:

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; 
} 

Bây giờ khi bạn thêm các tế bào sử dụng ID định nghĩa kiểu như sau:

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

EDIT: Bạn cần phải thêm stylesheet sau khi thêm workbookpart ..

+0

Cảm ơn sự giúp đỡ của bạn. Thật không may khi bạn mở một tài liệu Excel cửa sổ xuất hiện với thông báo: '" Trong cuốn sách "specitication.xlsx" tìm thấy nội dung không thể đọc được. Cố gắng khôi phục nội dung của sách? Nếu bạn tin tưởng nguồn của sổ làm việc này , bấm "Có". "' Nếu bạn chọn "Không", tài liệu không mở. Nếu bạn chọn "Có", sau đó mở tài liệu mà không có kiểu. –

+0

Bạn có gặp vấn đề này trước đây không? Hoặc đã xảy ra sau khi thêm kiểu –

+0

Thông báo này xuất hiện sau khi thêm thay đổi. Tôi thêm stylesheet sau khi thêm workbookpart. Tôi có thể chèn thay đổi mã, nhưng tôi nghĩ rằng nó quá nhiều –

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; 
} 
+0

Vui lòng xem xét thêm giải thích bằng tiếng Anh đơn giản cho câu trả lời của bạn để cải thiện chất lượng và mô tả cách mã của bạn giải quyết vấn đề của OP. – MikaS

Các vấn đề liên quan