2013-04-26 34 views
5

tôi thu hẹp nó xuống:Bảng tính OpenXML: Excel đưa ra lỗi, sau đó sửa lỗi và nó hoạt động. (C#)

 //aantal auto's 
     Row aantalAutosRow = new Row(); 
     aantalAutosRow.RowIndex = Convert.ToUInt32((tblXML.Rows.Count) + 2); 

     Cell aantalAutosCell = new Cell(); 
     aantalAutosCell.CellReference = getColumnName(1); 
     aantalAutosCell.CellValue = new CellValue("Hoi"); 

     aantalAutosRow.Append(aantalAutosCell); 
     sheetData.Append(aantalAutosRow); 

này tạo ra các tế bào sau khi tôi bấm vào Có khi Excel nhắc nhở để sửa chữa các tập tin (sheet.xml)

Toàn bộ lớp:

  using System; 
      using System.Collections.Generic; 
      using System.Linq; 
      using System.Text; 
      using DocumentFormat.OpenXml; 
      using DocumentFormat.OpenXml.Packaging; 
      using DocumentFormat.OpenXml.Spreadsheet; 
      using System.IO; 
      using System.Xml; 
      using System.Data; 

      namespace XML_naar_Excel 
      { 
       class Excel 
       { 
        public void convertToExcel(string padXml) 
        { 
         //maak dataset en vul met ingevoerde xml 
         DataSet dsXML = new DataSet(); 
         dsXML.ReadXml(padXml); 
         DataTable tblXML = dsXML.Tables[2]; 

         //opslaan 
         string padXlsx = Path.GetDirectoryName(padXml) + "\\voorraad " + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + ".xlsx"; 

         //spreadsheet 
         using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(padXlsx, SpreadsheetDocumentType.Workbook)) 
         { 
          WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart(); 
          WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); 
          Workbook workbook = new Workbook(); 
          FileVersion fv = new FileVersion(); 
          fv.ApplicationName = "Microsoft Office Excel"; 
          Worksheet worksheet = new Worksheet(); 
          SheetData sheetData = new SheetData(); 

          //styles 
          Style s = new Style(); 
          WorkbookStylesPart stylesPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorkbookStylesPart>(); 
          stylesPart.Stylesheet = s.GenerateStyleSheet(); 
          stylesPart.Stylesheet.Save(); 

          //kolommen 
          Columns columns = new Columns(); 
          for (int i = 1; i < tblXML.Columns.Count; i++) 
          { 
           Column column = new Column(); 
           column.Min = Convert.ToUInt32(i); 
           column.Max = Convert.ToUInt32(i + 1); 
           int lengte = tblXML.Rows[13][i-1].ToString().Length; 
           if (lengte < 10) 
           { 
            lengte = 10; 
           } 
           else if (lengte > 35) 
           { 
            lengte = 35; 
           } 
           else 
           { 
            lengte += 5; 
           } 
           column.Width = lengte; 
           column.BestFit = true; 
           columns.Append(column); 
          } 
          worksheet.Append(columns); 

          //header 
          Row header = new Row(); 
          header.RowIndex = (UInt32)1; 

          foreach (DataColumn columnInDataTable in tblXML.Columns) 
          { 
           Cell headerCell = createTextCell(tblXML.Columns.IndexOf(columnInDataTable) + 1, 1, columnInDataTable.ColumnName); 
           headerCell.StyleIndex = 1; 
           header.AppendChild(headerCell); 
          } 
          sheetData.AppendChild(header); 

          // Add a row to the cell table. 
          for (int i = 1; i < tblXML.Rows.Count; i++) 
          { 
           Row row; 
           row = new Row() { RowIndex = Convert.ToUInt32(i) + 1 }; 

           for (int j = 0; j < tblXML.Columns.Count; j++) 
           { 
            Cell newCell = new Cell() 
            { 
             CellReference = getColumnName(i), 
             DataType = CellValues.String, 
             StyleIndex = 6, 
             CellValue = new CellValue(tblXML.Rows[i][j].ToString()), 
            }; 
            row.Append(newCell); 
           } 
           sheetData.Append(row); 
          } 

          //autofilter 
          string laatsteKolom = zoekLaatsteKolom(tblXML); 
          AutoFilter autoFilter = new AutoFilter(); 
          autoFilter.Reference = "A1:" + laatsteKolom + "1"; 

          //aantal auto's 
          Row aantalAutosRow = new Row(); 
          aantalAutosRow.RowIndex = Convert.ToUInt32((tblXML.Rows.Count) + 2); 

          Cell aantalAutosCell = new Cell(); 
          aantalAutosCell.CellReference = getColumnName(1); 
          aantalAutosCell.CellValue = new CellValue("Hoi"); 
          //CellFormula berekenAantalAutos = new CellFormula(); 
          //berekenAantalAutos.Text = "=COUNTA(A2:A" + tblXML.Rows.Count.ToString(); 

          //aantalAutosCell.Append(berekenAantalAutos); 
          aantalAutosRow.Append(aantalAutosCell); 
          sheetData.Append(aantalAutosRow); 

          worksheet.Append(sheetData); 
          worksheet.Append(autoFilter); 
          worksheetPart.Worksheet = worksheet; 
          worksheetPart.Worksheet.Save(); 

          Sheets sheets = new Sheets(); 
          Sheet sheet = new Sheet(); 
          sheet.Name = "Voorraad"; 
          sheet.SheetId = 1; 
          sheet.Id = workbookPart.GetIdOfPart(worksheetPart); 
          sheets.Append(sheet); 
          workbook.Append(fv); 
          workbook.Append(sheets); 

          spreadsheetDocument.WorkbookPart.Workbook = workbook; 
          spreadsheetDocument.WorkbookPart.Workbook.Save(); 
          spreadsheetDocument.Close(); 
         } 
        } 

        //kolom naam (letter) ophalen 
        private string getColumnName(int columnIndex) 
        { 
         int dividend = columnIndex; 
         string columnName = String.Empty; 
         int modifier; 

         while (dividend > 0) 
         { 
          modifier = (dividend - 1) % 26; 
          columnName = 
           Convert.ToChar(65 + modifier).ToString() + columnName; 
          dividend = (int)((dividend - modifier)/26); 
         } 

         return columnName; 
        } 

        private Cell createTextCell(int columnIndex, int rowIndex, object cellValue) 
        { 
         Cell cell = new Cell(); 

         cell.DataType = CellValues.InlineString; 
         cell.CellReference = getColumnName(columnIndex) + rowIndex; 

         InlineString inlineString = new InlineString(); 
         Text t = new Text(); 

         t.Text = cellValue.ToString(); 
         inlineString.AppendChild(t); 
         cell.AppendChild(inlineString); 

         return cell; 
        } 

        string zoekLaatsteKolom(DataTable tblXML) 
        { 
         string kolom; 
         kolom = getColumnName(tblXML.Columns.Count); 
         return kolom; 
        } 
       } 
      } 

Ai đó có thể cho tôi biết những gì tôi đang làm là bất hợp pháp với Excel không? Tôi nghĩ rằng excel làm cho SharedStrings khi vá nó. Tôi chưa bao giờ làm việc với SharedStrings và tôi hy vọng tôi không phải làm vậy.

+1

Bạn có thể thử tải OpenXMLSDKToolV25.msi từ http://www.microsoft.com/en-us/download/details.aspx?id=30425 nếu bạn tải tập tin được tạo của bạn vào Năng suất Công cụ trong nhiều trường hợp nó có thể cho bạn biết những gì là bất hợp pháp trong tập tin được tạo ra của bạn. –

Trả lời

3

Tôi đã xem xét mã của bạn và tìm thấy 4 địa điểm cần thay đổi để tạo tài liệu excel không có lỗi.

  • 1. Thay thế stylesPart.Stylesheet = s.GenerateStyleSheet(); bởi stylesPart.Stylesheet = new Stylesheet();
  • 2. nhận xét ra như sau: //headerCell.StyleIndex = 1;
  • 3. nhận xét ra như sau: //StyleIndex = 6,
  • 4. gia tăng như sau: aantalAutosCell.DataType = CellValues.String;
  • Mã đăng tải dưới đây làm việc cho tôi và tạo ra một tài liệu excel lỗi miễn phí. Ít con trỏ bạn cần biết

  • 1. Bạn không thể chỉ định tùy ý các chỉ mục phong cách khi làm việc với Open XML Docs
  • 2. Khi bạn có loại dữ liệu chuỗi được lưu trữ, bạn nên sử dụng CellValues.String (vì bạn don ' t muốn sử dụng Shared String)
  • 3. Thật đáng giá khi đọc về SharedStrings khi làm việc với Open XML SDK. Các chuỗi chia sẻ làm giảm kích thước tổng thể của tệp của bạn và làm cho mọi thứ tốt hơn nhiều. Xem http://msdn.microsoft.com/en-us/library/office/gg278314.aspx
  • using System; 
    using System.Data; 
    using System.IO; 
    using DocumentFormat.OpenXml.Packaging; 
    using DocumentFormat.OpenXml.Spreadsheet; 
    using DocumentFormat.OpenXml; 
    
    namespace TestOpenXmlSDK 
    { 
        class Excel 
        { 
         public void convertToExcel(string padXml) 
         { 
          //maak dataset en vul met ingevoerde xml 
          DataSet dsXML = new DataSet(); 
          dsXML.ReadXml(padXml); 
          DataTable tblXML = dsXML.Tables[2]; 
    
          //opslaan 
          string padXlsx = Path.GetDirectoryName(padXml) + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + ".xlsx"; 
    
          //spreadsheet 
          using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(padXlsx, SpreadsheetDocumentType.Workbook)) 
          { 
           WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart(); 
           WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); 
           Workbook workbook = new Workbook(); 
           FileVersion fv = new FileVersion(); 
           fv.ApplicationName = "Microsoft Office Excel"; 
           Worksheet worksheet = new Worksheet(); 
           SheetData sheetData = new SheetData(); 
    
           //styles 
           WorkbookStylesPart stylesPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorkbookStylesPart>(); 
           stylesPart.Stylesheet = new Stylesheet(); 
           stylesPart.Stylesheet.Save(); 
    
           //kolommen 
           DocumentFormat.OpenXml.Spreadsheet.Columns columns = new Columns(); 
           for (int i = 1; i < tblXML.Columns.Count; i++) 
           { 
            Column column = new Column(); 
            column.Min = Convert.ToUInt32(i); 
            column.Max = Convert.ToUInt32(i + 1); 
            int lengte = tblXML.Rows[13][i - 1].ToString().Length; 
            if (lengte < 10) 
            { 
             lengte = 10; 
            } 
            else if (lengte > 35) 
            { 
             lengte = 35; 
            } 
            else 
            { 
             lengte += 5; 
            } 
            column.Width = lengte; 
            column.BestFit = true; 
            columns.Append(column); 
           } 
           worksheet.Append(columns); 
    
           //header 
           Row header = new Row(); 
           header.RowIndex = (UInt32)1; 
    
           foreach (DataColumn columnInDataTable in tblXML.Columns) 
           { 
            Cell headerCell = createTextCell(tblXML.Columns.IndexOf(columnInDataTable) + 1, 1, columnInDataTable.ColumnName); 
            //headerCell.StyleIndex = 1; 
            header.AppendChild(headerCell); 
           } 
           sheetData.AppendChild(header); 
    
           // Add a row to the cell table. 
           for (int i = 1; i < tblXML.Rows.Count; i++) 
           { 
            Row row; 
            row = new Row() { RowIndex = Convert.ToUInt32(i) + 1 }; 
    
            for (int j = 0; j < tblXML.Columns.Count; j++) 
            { 
             Cell newCell = new Cell() 
             { 
              CellReference = getColumnName(i), 
              DataType = CellValues.Number, 
              //StyleIndex = 6, 
              CellValue = new CellValue(tblXML.Rows[i][j].ToString()), 
             }; 
             row.Append(newCell); 
            } 
            sheetData.Append(row); 
           } 
    
           //autofilter 
           string laatsteKolom = zoekLaatsteKolom(tblXML); 
           AutoFilter autoFilter = new AutoFilter(); 
           autoFilter.Reference = "A1:" + laatsteKolom + "1"; 
    
           //aantal auto's 
           Row aantalAutosRow = new Row(); 
           aantalAutosRow.RowIndex = Convert.ToUInt32((tblXML.Rows.Count) + 2); 
    
           Cell aantalAutosCell = new Cell(); 
           aantalAutosCell.CellReference = getColumnName(1); 
           aantalAutosCell.CellValue = new CellValue("Hoi"); 
           aantalAutosCell.DataType = CellValues.String; 
           //CellFormula berekenAantalAutos = new CellFormula(); 
           //berekenAantalAutos.Text = "=COUNTA(A2:A" + tblXML.Rows.Count.ToString(); 
    
           //aantalAutosCell.Append(berekenAantalAutos); 
           aantalAutosRow.Append(aantalAutosCell); 
           sheetData.Append(aantalAutosRow); 
    
           worksheet.Append(sheetData); 
           worksheet.Append(autoFilter); 
           worksheetPart.Worksheet = worksheet; 
           worksheetPart.Worksheet.Save(); 
    
           Sheets sheets = new Sheets(); 
           Sheet sheet = new Sheet(); 
           sheet.Name = "Voorraad"; 
           sheet.SheetId = 1; 
           sheet.Id = workbookPart.GetIdOfPart(worksheetPart); 
           sheets.Append(sheet); 
           workbook.Append(fv); 
           workbook.Append(sheets); 
    
           spreadsheetDocument.WorkbookPart.Workbook = workbook; 
           spreadsheetDocument.WorkbookPart.Workbook.Save(); 
           spreadsheetDocument.Close(); 
          } 
         } 
    
         //kolom naam (letter) ophalen 
         private string getColumnName(int columnIndex) 
         { 
          int dividend = columnIndex; 
          string columnName = String.Empty; 
          int modifier; 
    
          while (dividend > 0) 
          { 
           modifier = (dividend - 1) % 26; 
           columnName = 
            Convert.ToChar(65 + modifier).ToString() + columnName; 
           dividend = (int)((dividend - modifier)/26); 
          } 
    
          return columnName; 
         } 
    
         private Cell createTextCell(int columnIndex, int rowIndex, object cellValue) 
         { 
          Cell cell = new Cell(); 
    
          cell.DataType = CellValues.InlineString; 
          cell.CellReference = getColumnName(columnIndex) + rowIndex; 
    
          InlineString inlineString = new InlineString(); 
          Text t = new Text(); 
    
          t.Text = cellValue.ToString(); 
          inlineString.AppendChild(t); 
          cell.AppendChild(inlineString); 
    
          return cell; 
         } 
    
         string zoekLaatsteKolom(DataTable tblXML) 
         { 
          string kolom; 
          kolom = getColumnName(tblXML.Columns.Count); 
          return kolom; 
         } 
        } 
    } 
    
    +0

    @Isrchckn: Nếu mã này làm việc cho bạn, vui lòng đánh dấu nó là câu trả lời. – cvraman

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