将datatable相关内容写入到excel中

1、整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。

2、NPOI是POI的C#版本,NPOI的行和列的index都是从0开始

3、POI读取Excel有两种格式一个是HSSF,另一个是XSSF。 HSSF和XSSF的区别如下: 
HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. 
XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format. 
即:HSSF适用2007以前的版本,XSSF适用2007版本及其以上的。


使用npoi  

 public static void ExportExcel(System.Data.DataTable dtSource, string strHeaderText, string strFileName)
        {
            #region
            MemoryStream ms = Export(dtSource, strHeaderText);
            FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write, FileShare.Read);
            byte[] data = ms.ToArray();
            fs.Write(data, 0, data.Length);
            fs.Flush();
            fs.Close();
            #endregion
        }


 public static MemoryStream Export(System.Data.DataTable dtSource, string strHeaderText)
        {
            #region
            HSSFWorkbook workbook = new HSSFWorkbook();
            #region 右击文件 属性信息
            {
                DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
                dsi.Company = "http://www.southgis.com";
                workbook.DocumentSummaryInformation = dsi;


                SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
                si.Author = "southgis"; //填加xls文件作者信息   
                si.ApplicationName = "AppDMS"; //填加xls文件创建程序信息   
                si.LastAuthor = "s"; //填加xls文件最后保存者信息   
                si.Comments = "s"; //填加xls文件作者信息   
                si.Title = "s"; //填加xls文件标题信息   
                si.Subject = "s";//填加文件主题信息   
                si.CreateDateTime = DateTime.Now;
                workbook.SummaryInformation = si;
            }
            #endregion


            HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
            HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
            dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");


            //取得列宽   
            int[] arrColWidth = new int[dtSource.Columns.Count];
            foreach (DataColumn item in dtSource.Columns)
            {
                arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
            }
            for (int i = 0; i < dtSource.Rows.Count; i++)
            {
                for (int j = 0; j < dtSource.Columns.Count; j++)
                {
                    int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
                    if (intTemp > arrColWidth[j])
                    {
                        arrColWidth[j] = intTemp;
                    }
                }
            }






            int rowIndex = 0;
            //列风格
            HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
            headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CenterSelection;//.CENTER_SELECTION;
            headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN;
            headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN; ;
            headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN;
            headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN; ;
            HSSFFont font = workbook.CreateFont() as HSSFFont;
            font.FontHeightInPoints = 10;
            font.Boldweight = 600;
            headStyle.SetFont(font);
            //行风格
            HSSFCellStyle rowStyle = workbook.CreateCellStyle() as HSSFCellStyle;
            rowStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//.CENTER;
            rowStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN;
            rowStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN;
            rowStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN;
            rowStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//.CellBorderType.THIN;
            font = workbook.CreateFont() as HSSFFont;
            font.FontHeightInPoints = 10;
            font.Boldweight = 300;
            rowStyle.SetFont(font);


            //创建sheet
            HSSFSheet sheet = null;
            do
            {
                #region 新建表,填充表头,填充列头,样式
                sheet = workbook.CreateSheet() as HSSFSheet;
                sheet.DisplayGridlines = true;


                #region 表头及样式
                {
                    if (!string.IsNullOrEmpty(strHeaderText))
                    {
                        rowIndex++;
                        HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
                        headerRow.CreateCell(0).SetCellValue(strHeaderText);


                        for (int i = 0; i < dtSource.Columns.Count; i++)
                        {
                            headerRow.CreateCell(i + 1);
                            headerRow.GetCell(i).CellStyle = headStyle;
                        }


                        sheet.AddMergedRegion(new NPOI.SS.Util.Region(0, 0, 0, dtSource.Columns.Count - 1));
                        headerRow = null;
                    }
                }
                #endregion


                #region 列头及样式
                {
                    HSSFRow headerRow = sheet.CreateRow(rowIndex) as HSSFRow;


                    rowIndex++;


                    foreach (DataColumn column in dtSource.Columns)
                    {
                        headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                        headerRow.GetCell(column.Ordinal).CellStyle = headStyle;


                        //设置列宽   
                        sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);


                    }
                    headerRow = null;
                }
                #endregion
                #endregion
                int dtRowIndex = 0;
                while (dtRowIndex < dtSource.Rows.Count)
                {
                    #region 填充内容
                    DataRow row = dtSource.Rows[dtRowIndex];
                    HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
                    foreach (DataColumn column in dtSource.Columns)
                    {
                        HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;


                        string drValue = row[column].ToString();
                        dataRow.GetCell(column.Ordinal).CellStyle = rowStyle;


                        switch (column.DataType.ToString())
                        {
                            case "System.String"://字符串类型   
                                newCell.SetCellValue(drValue);
                                break;
                            case "System.DateTime"://日期类型   
                                DateTime dateV;
                                DateTime.TryParse(drValue, out dateV);
                                newCell.SetCellValue(dateV);
                                newCell.CellStyle = dateStyle;//格式化显示   
                                break;
                            case "System.Boolean"://布尔型   
                                bool boolV = false;
                                bool.TryParse(drValue, out boolV);
                                newCell.SetCellValue(boolV);
                                break;
                            case "System.Int16"://整型   
                            case "System.Int32":
                            case "System.Int64":
                            case "System.Byte":
                                int intV = 0;
                                int.TryParse(drValue, out intV);
                                newCell.SetCellValue(intV);
                                break;
                            case "System.Decimal"://浮点型   
                            case "System.Double":
                                double doubV = 0;
                                double.TryParse(drValue, out doubV);
                                newCell.SetCellValue(doubV);
                                break;
                            case "System.DBNull"://空值处理   
                                newCell.SetCellValue("");
                                break;
                            default:
                                newCell.SetCellValue("");
                                break;
                        }
                    }
                    #endregion
                    ++rowIndex;
                    dtRowIndex++;
                    if (rowIndex % 10000 == 0)
                    {
                        break;
                    }
                }
            } while (rowIndex < dtSource.Rows.Count);


            using (MemoryStream ms = new MemoryStream())
            {
                workbook.Write(ms);
                ms.Flush();
                ms.Position = 0;


                //sheet.Dispose();
                //workbook.Dispose();
                return ms;
            }
            #endregion
        }
    }
}







后来采用整体赋值的方法修改,代码如下:

该方法中首先是应用程序applicaton----workbooks-----workbook-----worksheet-----worksheet.getrange方法或许范围------rangge-----将二维数组objdata整体赋给range-----保存!  OK完成

[csharp]  view plain copy
  1. //把数据表的内容导出到Excel文件中  
  2. public static void OutDataToExcel(System.Data.DataTable srcDataTable, string excelFilePath)  
  3. {  
  4.     Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();  
  5.     object missing = System.Reflection.Missing.Value;  
  6.   
  7.     //导出到execl   
  8.     try  
  9.     {  
  10.         if (xlApp == null)  
  11.         {  
  12.             MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel!");  
  13.             return;  
  14.         }  
  15.   
  16.         Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;  
  17.         Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);  
  18.         Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];  
  19.   
  20.         //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写  
  21.         xlApp.Visible = false;  
  22.   
  23.         object[,] objData = new object[srcDataTable.Rows.Count + 1, srcDataTable.Columns.Count];  
  24.         //首先将数据写入到一个二维数组中  
  25.         for (int i = 0; i < srcDataTable.Columns.Count; i++)  
  26.         {  
  27.             objData[0, i] = srcDataTable.Columns[i].ColumnName;  
  28.         }  
  29.         if (srcDataTable.Rows.Count > 0)  
  30.         {  
  31.             for (int i = 0; i < srcDataTable.Rows.Count; i++)  
  32.             {  
  33.                 for (int j = 0; j < srcDataTable.Columns.Count; j++)  
  34.                 {  
  35.                     objData[i + 1, j] = srcDataTable.Rows[i][j];  
  36.                 }  
  37.             }  
  38.         }  
  39.   
  40.         string startCol = "A";  
  41.         int iCnt = (srcDataTable.Columns.Count / 26);  
  42.         string endColSignal = (iCnt == 0 ? "" : ((char)('A' + (iCnt - 1))).ToString());  
  43.         string endCol = endColSignal + ((char)('A' + srcDataTable.Columns.Count - iCnt * 26 - 1)).ToString();  
  44.         Excel.Range range = xlSheet.get_Range(startCol + "1", endCol + (srcDataTable.Rows.Count - iCnt * 26 + 1).ToString());  
  45.   
  46.         range.Value = objData; //给Exccel中的Range整体赋值  
  47.         range.EntireColumn.AutoFit(); //设定Excel列宽度自适应  
  48.         xlSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1;//Excel文件列名 字体设定为Bold  
  49.   
  50.         //设置禁止弹出保存和覆盖的询问提示框  
  51.         xlApp.DisplayAlerts = false;  
  52.         xlApp.AlertBeforeOverwriting = false;  
  53.   
  54.         if (xlSheet != null)  
  55.         {  
  56.             xlSheet.SaveAs(excelFilePath, missing, missing, missing, missing, missing, missing, missing, missing, missing);  
  57.             //xlApp.Quit();  
  58.             KillProcess(xlApp);  
  59.         }  
  60.     }  
  61.     catch (Exception ex)  
  62.     {  
  63.         KillProcess(xlApp);  
  64.         throw ex;  
  65.     }  
  66. }  

 

测试之前的19203行的DataTable,用时为4秒多一些。

你可能感兴趣的:(C#)