2013-05-17 18 views
6

Próbuję wo zapisywać Numbers z DataTable do arkusza danych - niestety, to nie działa zgodnie z oczekiwaniami, e. sol. DataSheet jest uszkodzony.Office Open XMl SDK Zapisywanie liczb na arkuszu

używam następujący kod:

private void AddDataToSheet(ExcelViewData data, SheetData sheetData) 
      { 
       var excelData = data.WriteableDataTable; 
//// this returns a datatable 
////the numbers have a format like "8,1" "8,0" etc. 
       for (int i = 0; i < excelData.Rows.Count; i++) 
       { 
        Row row = new Row(); 
        //row.RowIndex = (UInt32)i; 
        for (int c = 0; c < excelData.Columns.Count; c++) 
        { 
         Cell cell = new Cell(); 
         CellValue cellvalue = new CellValue(); 
         //cell.CellReference = SharedMethods.GetExcelColumnName(i + 1) + (c + 1).ToString(); 
         cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Number; 
         cellvalue.Text = excelData.Rows[i][c].ToString().Replace(",","."); 
         cell.Append(cellvalue); 
         row.Append(cell); 
        } 

        sheetData.Append(row); 
       } 
      } 

jakiś pomysł, dlaczego to się nie powiedzie? Mam wiele tutoriali z tym samym podejściem.

Odpowiedz

4

wypróbować tę metodę:

public void InsertDataTableIntoExcel(SpreadsheetDocument _excelDoc, SheetData SheetData, DataTable excelData, int rowIndex = 1) 
    { 
     if (_excelDoc != null && SheetData != null) 
     { 
      if (excelData.Rows.Count > 0) 
      { 
       try 
       { 
        uint lastRowIndex = (uint)rowIndex; 
        for (int row = 0; row < excelData.Rows.Count; row++) 
        { 
         Row dataRow = GetRow(lastRowIndex, true); 
         for (int col = 0; col < excelData.Columns.Count; col++) 
         { 
          Cell cell = GetCell(dataRow, col + 1, lastRowIndex); 

          string objDataType = excelData.Rows[row][col].GetType().ToString(); 
          //Add text to text cell 
          if (objDataType.Contains(TypeCode.Int32.ToString()) || objDataType.Contains(TypeCode.Int64.ToString()) || objDataType.Contains(TypeCode.Decimal.ToString())) 
          { 
           cell.DataType = new EnumValue<CellValues>(CellValues.Number); 
           cell.CellValue = new CellValue(objData.ToString()); 
          } 
          else 
          { 
           cell.CellValue = new CellValue(objData.ToString()); 
           cell.DataType = new EnumValue<CellValues>(CellValues.String); 
          } 
         } 
         lastRowIndex++; 
        } 
       } 
       catch (OpenXmlPackageException ex) 
       { 
        throw ex; 
       } 
       catch (Exception ex) 
       { 
        throw ex; 
       } 
      } 
      else 
      { 
       OpenXmlPackageException openEx = new OpenXmlPackageException("No data from datatable"); 
       throw openEx; 
      } 
     } 
     else 
     { 
      OpenXmlPackageException openEx = new OpenXmlPackageException("Workbook not found"); 
      throw openEx; 
     } 
    } 
+0

Dziękuję za kod - unfortuanetly, zaczynam w idealnie czystej kartce, nie istnieją żadne wiersze do zapisu. Wypróbuję wewnętrzny kod - wygląda bardzo obiecująco! –

+0

to świeża metoda, która działa dobrze, możesz użyć kodu, w którym tworzysz komórkę i dodajesz wartość komórki, a CellType to nic innego jak formatowanie komórki. Mam nadzieję, że da ci to odpowiedź. – KirtiSagar

+0

Udało się, dziękuję! :) –

Powiązane problemy