【问题标题】:export Excel to DataTable using NPOI使用 NPOI 将 Excel 导出到 DataTable
【发布时间】:2012-11-11 17:09:49
【问题描述】:

我想使用 NPOI 读取 Excel Tables 2010 xlsx,然后将数据导出到 DataTables,但不知道如何使用它。谁能逐步告诉我如何将 Excel 导出到 Datatable?我已经下载了 NPOI.dll,添加到参考,但不知道还有什么...

【问题讨论】:

    标签: c# excel datatable npoi


    【解决方案1】:

    以下是您可以使用 NPOI 将 Excel 文件转换为 DataSet 的最少代码:

    IWorkbook workbook;
    using (var stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
    {
        workbook = new HSSFWorkbook(stream); // XSSFWorkbook for XLSX
    }
    
    var sheet = workbook.GetSheetAt(0); // zero-based index of your target sheet
    var dataTable = new DataTable(sheet.SheetName);
    
    // write the header row
    var headerRow = sheet.GetRow(0);
    foreach (var headerCell in headerRow)
    {
        dataTable.Columns.Add(headerCell.ToString());
    }
    
    // write the rest
    for(int i = 1; i< sheet.PhysicalNumberOfRows; i++)
    {
        var sheetRow = sheet.GetRow(i);
        var dtRow = dataTable.NewRow();
        dtRow.ItemArray = dataTable.Columns
            .Cast<DataColumn>()
            .Select(c => sheetRow.GetCell(c.Ordinal, MissingCellPolicy.CREATE_NULL_AS_BLANK).ToString())
            .ToArray();
        dataTable.Rows.Add(dtRow);
    }
    

    【讨论】:

    • 不适用于不同行中的不同列大小,因此如果您有疯狂的 excel 文件,则“2015 年 9 月 4 日 9:19 LuckyS 回答”代码更好。
    • @Roger Deep 是对的,它会跳过 NULL 单元格,因此它们将具有不同的列索引,然后将被放置到不同的列中。
    • 已更新以处理 NULL 单元格。
    • @SaebAmini 还有其他更快的解决方案吗?循环遍历行需要很长时间来解析 20,000 条记录。
    【解决方案2】:
    private static ISheet GetFileStream(string fullFilePath)
    {
        var fileExtension = Path.GetExtension(fullFilePath);
        string sheetName;
        ISheet sheet = null;
        switch (fileExtension)
        {
            case ".xlsx":
                using (var fs = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read))
                {
                    var wb = new XSSFWorkbook(fs);
                    sheetName = wb.GetSheetAt(0).SheetName;
                    sheet = (XSSFSheet) wb.GetSheet(sheetName);
                }
                break;
            case ".xls":
                using (var fs = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read))
                {
                    var wb = new HSSFWorkbook(fs);
                    sheetName = wb.GetSheetAt(0).SheetName;
                    sheet = (HSSFSheet) wb.GetSheet(sheetName);
                }
                break;
        }
        return sheet;
    }
    
    private static DataTable GetRequestsDataFromExcel(string fullFilePath)
    {
        try
        {
            var sh = GetFileStream(fullFilePath);
            var dtExcelTable = new DataTable();
            dtExcelTable.Rows.Clear();
            dtExcelTable.Columns.Clear();
            var headerRow = sh.GetRow(0);
            int colCount = headerRow.LastCellNum;
            for (var c = 0; c < colCount; c++)
                dtExcelTable.Columns.Add(headerRow.GetCell(c).ToString());
            var i = 1;
            var currentRow = sh.GetRow(i);
            while (currentRow != null)
            {
                var dr = dtExcelTable.NewRow();
                for (var j = 0; j < currentRow.Cells.Count; j++)
                {
                    var cell = currentRow.GetCell(j);
    
                    if (cell != null)
                        switch (cell.CellType)
                        {
                            case CellType.Numeric:
                                dr[j] = DateUtil.IsCellDateFormatted(cell)
                                    ? cell.DateCellValue.ToString(CultureInfo.InvariantCulture)
                                    : cell.NumericCellValue.ToString(CultureInfo.InvariantCulture);
                                break;
                            case CellType.String:
                                dr[j] = cell.StringCellValue;
                                break;
                            case CellType.Blank:
                                dr[j] = string.Empty;
                                break;
                        }
                }
                dtExcelTable.Rows.Add(dr);
                i++;
                currentRow = sh.GetRow(i);
            }
            return dtExcelTable;
        }
        catch (Exception e)
        {
            throw;
        }
    }
    

    【讨论】:

    • 读取 Excel 文件并根据扩展名 xls 或 xlsx 将其转换为 DataTable
    • 小心具有多列的 excel 文件,因为这会创建具有多列的数据表 "for (var c = 0; c
    • 这个例子在处理多个不同的列总计的一些更改后完美地工作。谢谢拉蒂。
    • 我没有分析代码,但我认为您应该缓存 currentRow.Cells.Count 部分,因为 Row 对象的属性 Cells在每次调用时从内部 Dictionary 数据创建一个 List&lt;ICell&gt; 对象。事实上,该属性并非来自 Java 中的原始 Apache POI。
    【解决方案3】:

    您可以通过 NPOI 尝试这种简单的方法:

    private DataTable GetDataTableFromExcel(String Path)
        {
            XSSFWorkbook wb;
            XSSFSheet sh;
            String Sheet_name;
    
            using (var fs = new FileStream(Path, FileMode.Open, FileAccess.Read))
            {
                wb = new XSSFWorkbook(fs);
    
                   Sheet_name= wb.GetSheetAt(0).SheetName;  //get first sheet name
            }
            DataTable DT = new DataTable();
            DT.Rows.Clear();
            DT.Columns.Clear();
    
            // get sheet
            sh = (XSSFSheet)wb.GetSheet(Sheet_name);
    
            int i = 0;
            while (sh.GetRow(i) != null)
            {
                // add neccessary columns
                if (DT.Columns.Count < sh.GetRow(i).Cells.Count)
                {
                    for (int j = 0; j < sh.GetRow(i).Cells.Count; j++)
                    {
                        DT.Columns.Add("", typeof(string));
                    }
                }
    
                // add row
                DT.Rows.Add();
    
                // write row value
                for (int j = 0; j < sh.GetRow(i).Cells.Count; j++)
                {
                    var cell = sh.GetRow(i).GetCell(j);
    
                    if (cell != null)
                    {
                        // TODO: you can add more cell types capatibility, e. g. formula
                        switch (cell.CellType)
                        {
                            case NPOI.SS.UserModel.CellType.Numeric:
                                DT.Rows[i][j] = sh.GetRow(i).GetCell(j).NumericCellValue;
                                //dataGridView1[j, i].Value = sh.GetRow(i).GetCell(j).NumericCellValue;
    
                                break;
                            case NPOI.SS.UserModel.CellType.String:
                                DT.Rows[i][j] = sh.GetRow(i).GetCell(j).StringCellValue;
    
                                break;
                        }
                    }
                }
    
                i++;
            }
    
            return DT;
        }
    

    【讨论】:

    • 这也很有效,它具有“添加必要的列”检查,这对于列多于其他行的行是绝对必要的。谢谢 LuckyS,很棒的代码。
    【解决方案4】:

    你可以通过这样做来完成你的任务。

    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    using NPOI.Util.Collections;
    using NPOI;
    using System.Collections.Generic;
    using NPOI.OpenXmlFormats.Spreadsheet;
    using NPOI.HSSF.UserModel;
    using NPOI.SS.Util;
    
    public DataTable xlsxToDT(Stream str)
    {
    XSSFWorkbook hssfworkbook = new XSSFWorkbook(str);
    ISheet sheet = hssfworkbook.GetSheetAt(0);
    str.Close();
    
    DataTable dt = new DataTable();
    IRow headerRow = sheet.GetRow(0);
    IEnumerator rows = sheet.GetRowEnumerator();
    
    int colCount = headerRow.LastCellNum;
    int rowCount = sheet.LastRowNum;
    
    for (int c = 0; c < colCount; c++)
        dt.Columns.Add(headerRow.GetCell(c).ToString());
    
    while (rows.MoveNext())
    {
        IRow row = (XSSFRow)rows.Current;
        DataRow dr = dt.NewRow();
    
        for (int i = 0; i < colCount; i++)
        {
            ICell cell = row.GetCell(i);
    
            if (cell != null)
                dr[i] = cell.ToString();
        }
        dt.Rows.Add(dr);
    }
    return dt;
    

    }

    【讨论】:

      【解决方案5】:

      NPOI 是一种很好的免费读取 Excel 文件的方法,现在在第 2 版中,您可以读取 XLS 和 XLSX 文件类型。

      1. 在他们的网站上获取最新版本的 NPOI:https://npoi.codeplex.com/
      2. 在您的项目中添加对以下文件的引用:NPOI.dll、NPOI.OOXML.dll 和 NPOI.OpenXml4Net.dll。
      3. 添加以下使用:使用 NPOI.SS.UserModel;使用 NPOI.HSSF.UserModel;使用 NPOI.XSSF.UserModel;

      现在下面的代码可以解决问题了,cmets 是西班牙语,抱歉:-p

      private DataTable Excel_To_DataTable(string pRutaArchivo, int pHojaIndex)
          {
              // --------------------------------- //
              /* REFERENCIAS:
               * NPOI.dll
               * NPOI.OOXML.dll
               * NPOI.OpenXml4Net.dll */
              // --------------------------------- //
              /* USING:
               * using NPOI.SS.UserModel;
               * using NPOI.HSSF.UserModel;
               * using NPOI.XSSF.UserModel; */
              // --------------------------------- //
              DataTable Tabla = null;
              try
              {
                  if (System.IO.File.Exists(pRutaArchivo))
                  {
      
                      IWorkbook workbook = null;  //IWorkbook determina se es xls o xlsx              
                      ISheet worksheet = null;
                      string first_sheet_name = "";
      
                      using (FileStream FS = new FileStream(pRutaArchivo, FileMode.Open, FileAccess.Read))
                      {
                          workbook = WorkbookFactory.Create(FS); //Abre tanto XLS como XLSX
                          worksheet = workbook.GetSheetAt(pHojaIndex); //Obtener Hoja por indice
                          first_sheet_name = worksheet.SheetName;  //Obtener el nombre de la Hoja
      
                          Tabla = new DataTable(first_sheet_name);
                          Tabla.Rows.Clear();
                          Tabla.Columns.Clear();
      
                          // Leer Fila por fila desde la primera
                          for (int rowIndex = 0; rowIndex <= worksheet.LastRowNum; rowIndex++)
                          {
                              DataRow NewReg = null;
                              IRow row = worksheet.GetRow(rowIndex);
                              IRow row2 = null;
      
                              if (row != null) //null is when the row only contains empty cells 
                              {
                                  if (rowIndex > 0) NewReg = Tabla.NewRow();
      
                                  //Leer cada Columna de la fila
                                  foreach (ICell cell in row.Cells)
                                  {
                                      object valorCell = null;
                                      string cellType = "";
      
                                      if (rowIndex == 0) //Asumo que la primera fila contiene los titlos:
                                      {
                                          row2 = worksheet.GetRow(rowIndex + 1); //Si es la rimera fila, obtengo tambien la segunda para saber los tipos:
                                          ICell cell2 = row2.GetCell(cell.ColumnIndex);
                                          switch (cell2.CellType)
                                          {
                                              case CellType.Boolean: cellType = "System.Boolean"; break;
                                              case CellType.String: cellType = "System.String"; break;
                                              case CellType.Numeric:
                                                  if (HSSFDateUtil.IsCellDateFormatted(cell2)) { cellType = "System.DateTime"; }
                                                  else { cellType = "System.Double"; }        break;
                                              case CellType.Formula:
                                                  switch (cell2.CachedFormulaResultType)
                                                  {
                                                      case CellType.Boolean: cellType = "System.Boolean"; break;
                                                      case CellType.String: cellType = "System.String"; break;
                                                      case CellType.Numeric:
                                                          if (HSSFDateUtil.IsCellDateFormatted(cell2)) { cellType = "System.DateTime"; }
                                                          else { cellType = "System.Double"; }    break;
                                                  }
                                                  break;
                                              default:
                                                  cellType = "System.String"; break;
                                          }
      
                                          //Agregar los campos de la tabla:
                                          DataColumn codigo = new DataColumn(cell.StringCellValue, System.Type.GetType(cellType));
                                          Tabla.Columns.Add(codigo);
                                      }
                                      else
                                      {
                                          //Las demas filas son registros:
                                          switch (cell.CellType)
                                          {
                                              case CellType.Blank:    valorCell = DBNull.Value; break;
                                              case CellType.Boolean:  valorCell = cell.BooleanCellValue; break;
                                              case CellType.String:   valorCell = cell.StringCellValue; break;
                                              case CellType.Numeric:
                                                  if (HSSFDateUtil.IsCellDateFormatted(cell)) { valorCell = cell.DateCellValue; }
                                                  else { valorCell = cell.NumericCellValue; } break;
                                              case CellType.Formula:
                                                  switch (cell.CachedFormulaResultType)
                                                  {
                                                      case CellType.Blank:    valorCell = DBNull.Value; break;
                                                      case CellType.String:   valorCell = cell.StringCellValue; break;
                                                      case CellType.Boolean:  valorCell = cell.BooleanCellValue; break;
                                                      case CellType.Numeric:
                                                          if (HSSFDateUtil.IsCellDateFormatted(cell)) { valorCell = cell.DateCellValue; }
                                                          else { valorCell = cell.NumericCellValue; }
                                                          break;
                                                  }
                                                  break;                                          
                                              default: valorCell = cell.StringCellValue; break;
                                          }
                                          NewReg[cell.ColumnIndex] = valorCell;
                                      }
                                  }
                              }
                              if (rowIndex > 0) Tabla.Rows.Add(NewReg);
                          }
                          Tabla.AcceptChanges();
                      }
                  }
                  else
                  {
                      throw new Exception("ERROR 404: El archivo especificado NO existe.");
                  }
              }
              catch (Exception ex)
              {
                  throw ex;
              }
              return Tabla;
          }
      

      上面的代码假设工作表的第一行有列名。 该代码还确定每个单元格的数据类型,并尝试将其转换为 ADO 数据类型。空白单元格被转换为 null。

      希望这对您和处于相同情况的其他人有所帮助。

      【讨论】:

        【解决方案6】:

        我编辑了@Saeb Amini 代码以允许空白单元格。

        IWorkbook workbook;
        using (FileStream stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
        {
            workbook = new HSSFWorkbook(stream);
        }
        
        ISheet sheet = workbook.GetSheetAt(0);
        DataTable dt = new DataTable(sheet.SheetName);
        
        // write header row
        IRow headerRow = sheet.GetRow(0);
        foreach (ICell headerCell in headerRow)
        {
            dt.Columns.Add(headerCell.ToString());
        }
        
        // write the rest
        int rowIndex = 0;
        foreach (IRow row in sheet)
        {
             // skip header row
             if (rowIndex++ == 0) continue;
        
             // add row into datatable
             var cells = new List<ICell>();
             for (int i = 0; i < dt.Columns.Count; i++)
             {
                  cells.Add(row.GetCell(i, MissingCellPolicy.CREATE_NULL_AS_BLANK));
             }
        
             // Columns formatted as DateTime will be printed as '01-Jul-2005', 
             // which can be converted to datetime in the SQL server.
             // select cast('01-Jul-2005' as DateTime).
             // In SQL Server we can convert DateTime to whatever string we want, for example
             // select convert(nvarchar(255), cast('01-Jul-2005' as datetime), 112) will print '20050701'.
             // http://www.sqlusa.com/bestpractices/datetimeconversion/
             dt.Rows.Add(cells.Select(c => c.ToString()).ToArray());
        
             // Datetimes also can be reformatted directly like this :
             // dt.Rows.Add(cells.Select(c =>
             //    c.CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(c) 
             //        ? c.DateCellValue.ToString("yyyyMMdd") 
             //        : c.ToString()
             // ).ToArray());
        
        }
        
        //return dt;
        

        【讨论】:

          【解决方案7】:

          在 Codeplex 网站 here 的下载部分有 example package - 一组 C# 示例。如果您还没有尝试过,请尝试一下。

          这是最简单的例子 -

          using NPOI.HSSF.UserModel;
          using NPOI.SS.UserModel;
          
          //.....
          
          private void button1_Click(object sender, EventArgs e)
          {
              HSSFWorkbook hssfwb;
              using (FileStream file = new FileStream(@"c:\test.xls", FileMode.Open, FileAccess.Read))
              {
                  hssfwb= new HSSFWorkbook(file);
              }
          
              ISheet sheet = hssfwb.GetSheet("Arkusz1");
              for (int row = 0; row <= sheet.LastRowNum; row++)
              {
                  if (sheet.GetRow(row) != null) //null is when the row only contains empty cells 
                  {
                      MessageBox.Show(string.Format("Row {0} = {1}", row, sheet.GetRow(row).GetCell(0).StringCellValue));
                  }
              }
          }  
          

          【讨论】:

          • 我试过了,但我得到了错误:OfficeXMLFileException 而不是 HSSF 我应该使用 XSSF,所以我将 HSSFWorkbook 更改为 XSSFWorkbook 但它不起作用
          【解决方案8】:

          基于@Sean's GREAT Answer 和example of NPOI,我将方法写到Convert all worksheets in xls file to DataSetConvert DataSet back to xls file

              public static DataSet GetDataSetFromXls(string excelFilePath)
              {
                  IWorkbook workbook;
                  using (FileStream stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
                  {
                      workbook = new HSSFWorkbook(stream);  //2003 xls
                      //workbook = new XSSFWorkbook();  //2007 xlsx
                  }
          
                  DataSet ds = new DataSet();
                  for (int i = 0; i < workbook.NumberOfSheets; i++)
                  {
                      ISheet sheet = workbook.GetSheetAt(i); // zero-based index of your target sheet
                      DataTable dt = new DataTable(sheet.SheetName);
          
                      // write header row
                      IRow headerRow = sheet.GetRow(0);
                      foreach (ICell headerCell in headerRow)
                      {
                          dt.Columns.Add(headerCell.ToString());
                      }
          
                      // write the rest
                      int rowIndex = 0;
                      foreach (IRow row in sheet)
                      {
                          // skip header row
                          if (rowIndex++ == 0) continue;
                          DataRow dataRow = dt.NewRow();
                          dataRow.ItemArray = row.Cells.Select(c => c.ToString()).ToArray();
                          dt.Rows.Add(dataRow);
                      }
          
                      ds.Tables.Add(dt);
                  }
          
                  return ds;
              }
          
          
              public static void SaveDataSetToXls(DataSet ds, string savedExcelFilePath)
              {
                  //IWorkbook workbook = new XSSFWorkbook();
                  IWorkbook workbook = new HSSFWorkbook();
          
                  foreach (DataTable dt in ds.Tables)
                  {
                      ISheet sheet = workbook.CreateSheet(dt.TableName);
          
                      var row0 = sheet.CreateRow(0);//header
                      for (int j = 0; j < dt.Columns.Count; j++)
                      {
                          row0.CreateCell(j).SetCellValue(dt.Columns[j].ColumnName);
                      }
          
                      for (int i = 0; i < dt.Rows.Count; i++)//rest
                      {
                          var row = sheet.CreateRow(1+i);
                          for (int j = 0; j < dt.Columns.Count; j++)
                              row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
                      }
                  }
          
                  FileStream sw = File.Create(savedExcelFilePath);
                  workbook.Write(sw);
                  sw.Close();
              }
          

          【讨论】:

            【解决方案9】:

            您可以在 Toxy 项目中尝试 ToxySpreadsheet - https://github.com/nissl-lab/toxy。 ToxySpreadsheet.ToDataSet() 就是你想要的。

            【讨论】:

              【解决方案10】:

              NOPI 可以使用 nuget 包

              ReadExcel

              基本用法: ExcelImportHelper.ReadExcel(字节);

              【讨论】:

                【解决方案11】:

                我知道我在这里有点晚了,但我认为这可能对其他人有所帮助

                我开发了一个使用 NPOI 包的 excel 实用程序,它可以

                1. 只需获取您的数据表或集合
                2. 并返回您的 excel,同时在 excel 中保持所有数据表/列表数据类型不变。

                Github 代码仓库:https://github.com/ansaridawood/.NET-Generic-Excel-Export-Sample/tree/master/GenericExcelExport/ExcelExport

                找代码解释,可以在这里找到: https://www.codeproject.com/Articles/1241654/Export-to-Excel-using-NPOI-Csharp-and-WEB-API

                它使用 NPOI DLL,它有 2 个 cs 文件要包含,然后你就可以开始了

                下面是第一个参考文件AbstractDataExport.cs

                using NPOI.SS.UserModel;
                using NPOI.XSSF.UserModel;
                using System;
                using System.Collections.Generic;
                using System.IO;
                using System.Net;
                using System.Net.Http;
                using System.Net.Http.Headers;
                
                namespace GenericExcelExport.ExcelExport
                {
                    public interface IAbstractDataExport
                    {
                        HttpResponseMessage Export(List exportData, string fileName, string sheetName);
                    }
                
                    public abstract class AbstractDataExport : IAbstractDataExport
                    {
                        protected string _sheetName;
                        protected string _fileName;
                        protected List _headers;
                        protected List _type;
                        protected IWorkbook _workbook;
                        protected ISheet _sheet;
                        private const string DefaultSheetName = "Sheet1";
                
                        public HttpResponseMessage Export
                              (List exportData, string fileName, string sheetName = DefaultSheetName)
                        {
                            _fileName = fileName;
                            _sheetName = sheetName;
                
                            _workbook = new XSSFWorkbook(); //Creating New Excel object
                            _sheet = _workbook.CreateSheet(_sheetName); //Creating New Excel Sheet object
                
                            var headerStyle = _workbook.CreateCellStyle(); //Formatting
                            var headerFont = _workbook.CreateFont();
                            headerFont.IsBold = true;
                            headerStyle.SetFont(headerFont);
                
                            WriteData(exportData); //your list object to NPOI excel conversion happens here
                
                            //Header
                            var header = _sheet.CreateRow(0);
                            for (var i = 0; i < _headers.Count; i++)
                            {
                                var cell = header.CreateCell(i);
                                cell.SetCellValue(_headers[i]);
                                cell.CellStyle = headerStyle;
                            }
                
                            for (var i = 0; i < _headers.Count; i++)
                            {
                                _sheet.AutoSizeColumn(i);
                            }
                
                            using (var memoryStream = new MemoryStream()) //creating memoryStream
                            {
                                _workbook.Write(memoryStream);
                                var response = new HttpResponseMessage(HttpStatusCode.OK)
                                {
                                    Content = new ByteArrayContent(memoryStream.ToArray())
                                };
                
                                response.Content.Headers.ContentType = new MediaTypeHeaderValue
                                       ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                                response.Content.Headers.ContentDisposition = 
                                       new ContentDispositionHeaderValue("attachment")
                                {
                                    FileName = $"{_fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
                                };
                
                                return response;
                            }
                        }
                
                        //Generic Definition to handle all types of List
                        public abstract void WriteData(List exportData);
                    }
                }
                

                这是第二个也是最后一个文件AbstractDataExportBridge.cs

                using NPOI.SS.UserModel;
                using System;
                using System.Collections.Generic;
                using System.ComponentModel;
                using System.Data;
                using System.Text.RegularExpressions;
                
                namespace GenericExcelExport.ExcelExport
                {
                    public class AbstractDataExportBridge : AbstractDataExport
                    {
                        public AbstractDataExportBridge()
                        {
                            _headers = new List<string>();
                            _type = new List<string>();
                        }
                
                        public override void WriteData<T>(List<T> exportData)
                        {
                            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
                
                            DataTable table = new DataTable();
                
                            foreach (PropertyDescriptor prop in properties)
                            {
                                var type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
                                _type.Add(type.Name);
                                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? 
                                                  prop.PropertyType);
                                string name = Regex.Replace(prop.Name, "([A-Z])", " $1").Trim(); //space separated 
                                                                                           //name by caps for header
                                _headers.Add(name);
                            }
                
                            foreach (T item in exportData)
                            {
                                DataRow row = table.NewRow();
                                foreach (PropertyDescriptor prop in properties)
                                    row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                                table.Rows.Add(row);
                            }
                
                            IRow sheetRow = null;
                
                            for (int i = 0; i < table.Rows.Count; i++)
                            {
                                sheetRow = _sheet.CreateRow(i + 1);
                                for (int j = 0; j < table.Columns.Count; j++)
                                {
                                    ICell Row1 = sheetRow.CreateCell(j);
                
                                    string type = _type[j].ToLower();
                                    var currentCellValue = table.Rows[i][j];
                
                                    if (currentCellValue != null && 
                                        !string.IsNullOrEmpty(Convert.ToString(currentCellValue)))
                                    {
                                        if (type == "string")
                                        {
                                            Row1.SetCellValue(Convert.ToString(currentCellValue));
                                        }
                                        else if (type == "int32")
                                        {
                                            Row1.SetCellValue(Convert.ToInt32(currentCellValue));
                                        }
                                        else if (type == "double")
                                        {
                                            Row1.SetCellValue(Convert.ToDouble(currentCellValue));
                                        }
                                    }
                                    else
                                    {
                                        Row1.SetCellValue(string.Empty);
                                    }
                                }
                            }
                        }
                    }
                }
                

                详细解释请参考开头提供的链接。

                【讨论】:

                  猜你喜欢
                  • 2017-05-25
                  • 2016-01-15
                  • 2012-11-20
                  • 1970-01-01
                  • 2016-04-16
                  • 1970-01-01
                  • 2011-12-12
                  • 2012-08-01
                  相关资源
                  最近更新 更多