【淘宝交易订单百万数据导出】C#快速汇出DataTable到Excel文件【已测试,正常运行】vs2017

项目中需要将DataTable中的内容汇出到Excel文件中,采用循环的方式逐个Cell写数据到Excel文件中, 测试时发现很不好,汇出一个19列203行的Table时,用时竟然高达24秒多。【vs2017】

后来采用整体赋值的方法修改,代码如下:【已测试,正常运行】

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Collections;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;

namespace MSExcel
{
   public class TestZYClass2
    {

        //把数据表的内容导出到Excel文件中
        public static void OutDataToExcel(System.Data.DataTable srcDataTable, string sheetName, string excelFilePath)
        {
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            object objMissing = System.Reflection.Missing.Value;
            //导出到execl 
            try
            {
                if (xlApp == null)
                {
                    //MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel!");
                    return;
                }

                Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                if (sheetName == "")
                {
                    // sheetName = "steet1";
                    return;
                }
                else
                {
                    ((Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1]).Name = sheetName;//将sheet1的名称改为sheetName值   
                }
                Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];



                object[,] objData = new object[srcDataTable.Rows.Count + 1, srcDataTable.Columns.Count];
                //首先将数据写入到一个二维数组中
                for (int i = 0; i < srcDataTable.Columns.Count; i++)
                {
                    objData[0, i] = srcDataTable.Columns[i].ColumnName;
                }
                if (srcDataTable.Rows.Count > 0)
                {
                    for (int i = 0; i < srcDataTable.Rows.Count; i++)
                    {
                        for (int j = 0; j < srcDataTable.Columns.Count; j++)
                        {
                            objData[i + 1, j] = srcDataTable.Rows[i][j];
                        }
                    }
                }

                string startCol = "A";
                int iCnt = (srcDataTable.Columns.Count / 26);
                string endColSignal = (iCnt == 0 ? "" : ((char)('A' + (iCnt - 1))).ToString());
                string endCol = endColSignal + ((char)('A' + srcDataTable.Columns.Count - iCnt * 26 - 1)).ToString();
                Excel.Range range = xlSheet.get_Range(startCol + "1", endCol + (srcDataTable.Rows.Count - iCnt * 26 + 1).ToString());

                range.Value = objData; //给Exccel中的Range整体赋值
                // range.EntireColumn.AutoFit(); //设定Excel列宽度自适应
                //xlSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1;//Excel文件列名 字体设定为Bold

                //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
                xlApp.Visible = false;
                //设置禁止弹出保存和覆盖的询问提示框
                xlApp.DisplayAlerts = false;
                xlApp.AlertBeforeOverwriting = false;

                xlBook.SaveAs(excelFilePath, objMissing, objMissing, objMissing, objMissing, objMissing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, objMissing, objMissing, objMissing, objMissing, objMissing);
                xlBook.Close(false, Missing.Value, Missing.Value);

                //退出并清理objects,回收内存
                xlApp.Quit();
                xlSheet = null;
                xlBook = null;
                xlApp = null;
                GC.Collect();

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        //把数据表的内容导出到Excel文件中
        public static  void OutDataToExcel(System.Data.DataTable srcDataTable, string excelFilePath)
        {
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            object objMissing = System.Reflection.Missing.Value;
            //导出到execl 
            try
            {
                if (xlApp == null)
                {
                    //MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel!");
                    return;
                }

                Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];



                object[,] objData = new object[srcDataTable.Rows.Count + 1, srcDataTable.Columns.Count];
                //首先将数据写入到一个二维数组中
                for (int i = 0; i < srcDataTable.Columns.Count; i++)
                {
                    objData[0, i] = srcDataTable.Columns[i].ColumnName;
                }
                if (srcDataTable.Rows.Count > 0)
                {
                    for (int i = 0; i < srcDataTable.Rows.Count; i++)
                    {
                        for (int j = 0; j < srcDataTable.Columns.Count; j++)
                        {
                            objData[i + 1, j] = srcDataTable.Rows[i][j];
                        }
                    }
                }

                string startCol = "A";
                int iCnt = (srcDataTable.Columns.Count / 26);
                string endColSignal = (iCnt == 0 ? "" : ((char)('A' + (iCnt - 1))).ToString());
                string endCol = endColSignal + ((char)('A' + srcDataTable.Columns.Count - iCnt * 26 - 1)).ToString();
                Excel.Range range = xlSheet.get_Range(startCol + "1", endCol + (srcDataTable.Rows.Count - iCnt * 26 + 1).ToString());

                range.Value = objData; //给Exccel中的Range整体赋值
                // range.EntireColumn.AutoFit(); //设定Excel列宽度自适应
                //xlSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1;//Excel文件列名 字体设定为Bold

                //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
                xlApp.Visible = false;
                //设置禁止弹出保存和覆盖的询问提示框
                xlApp.DisplayAlerts = false;
                xlApp.AlertBeforeOverwriting = false;

                xlBook.SaveAs(excelFilePath, objMissing, objMissing, objMissing, objMissing, objMissing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, objMissing, objMissing, objMissing, objMissing, objMissing);
                xlBook.Close(false, Missing.Value, Missing.Value);

                //退出并清理objects,回收内存
                xlApp.Quit();
                xlSheet = null;
                xlBook = null;
                xlApp = null;
                GC.Collect();

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }





    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C#,淘宝ERP项目)