2014-09-10 143 views
0

我有一些数据在DataSet工作,并试图将其导入到使用C#OpenXml一个Excel文件,我这样做是成功的,但在我DataSet我做有一些列的类型DateTime,integerdouble但我的代码是导入所有的列作为纯文本,使我不可能按工作表上的值排序它们。我使用下面的代码格式问题与从数据集数据导入到Excel表

public void ExportDataSet() 
     { 

      try 
      { 
       string fromFormat = "dd/MM/yyyy"; 
       string toFormat = "MM-dd-yyyy"; 

       DateTime newDate = DateTime.ParseExact(DateTime.Today.ToString(fromFormat), fromFormat, null); 


       string filedate = newDate.ToString(toFormat); 

       string destination = @"Z:\Physical DB Data " + filedate + ".xls"; 


       using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) 
       { 
        var workbookPart = workbook.AddWorkbookPart(); 

        workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); 

        workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets(); 

        DataSet ds = new DataSet(); 
        ds = GetPhysicalGrainReportAutomation(); 
        foreach (System.Data.DataTable table in ds.Tables) 
        { 

         var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>(); 
         var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData(); 
         sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData); 

         DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>(); 
         string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart); 

         uint sheetId = 1; 
         if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0) 
         { 
          sheetId = 
           sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1; 
         } 

         DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName }; 
         sheets.Append(sheet); 

         DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); 

         List<String> columns = new List<string>(); 
         foreach (System.Data.DataColumn column in table.Columns) 
         { 
          columns.Add(column.ColumnName); 

          DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); 
          cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 
          cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName); 
          headerRow.AppendChild(cell); 
         } 


         sheetData.AppendChild(headerRow); 

         foreach (System.Data.DataRow dsrow in table.Rows) 
         { 
          DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); 
          foreach (String col in columns) 
          { 
           DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); 
           cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 
           cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); // 
           newRow.AppendChild(cell); 
          } 

          sheetData.AppendChild(newRow); 
         } 

        } 
       } 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

     } 

我应该怎么做这个代码正常工作,而不是导入这些领域作为自己的类型? 当我使用interop循环并导入数据集时,它工作正常,但它需要很长时间,因为我的DataSet非常庞大,大约为15 columns并且超过50000 rows

我认为这个问题是在声明列清单的字符串如下

List<String> columns = new List<string>(); 

cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 

,但不知道如何处理这一点。

回答

0

我建议您使用NPOI XSSF/HSSF以避免这种情况,因为它有助于将单元格值属性设置为整数,日期时间,公式等,并且速度也很快。所以你只需要检查你的数据集的值,并根据类型设置单元属性。 欲了解更多信息,请访问https://npoi.codeplex.com/SourceControl/latest