zoukankan      html  css  js  c++  java
  • 大量数据导出Excel 之

    刚才准备写这个文章的时候,看到同事发来的群消息,我邪恶了。 我相信看到这篇文章的人 都比较纯,我就跟大家分享一下吧! 主要内容:现在因为需求变化,公司需要一台服务器做中转,公司一MM 准备了一台普通PC机来做服务器,然后问我一同事看下是否可以。 同事A就回复说:不知道这台PC能不能经得住? MM回复:“呵呵.你觉得它哪个部位经受不住?”同事就回复说:“应该不会是暴露的部位,怕连续搞受不住,可能会影响使用次数。” ~~   之后各种联想。(看到这里,思想邪恶的人请点击下面的“推荐+1” 消除罪恶感! )

         好了, 冷笑话到此为止。直入主题吧 。  最近公司项目涉及到千百万级别的数据导出问题。 老外(客户)那边又需要整理导出的数据,所以指定需要导出Excel格式的。大家都知道Excel格式的文件最大支持数据是65535条,怎么让千百万级别的数据量显示到同一个Excel里面呢? 在网上浏览了一下,都不如意,最后听说office安装目录有API,于是整理了下。知道答案的请直接点击下面的“推荐+1”然后就可以关掉浏览器了,不知道答案的我也不绕弯子了,请蛋定的看完下面的code,然后点击"推荐+1"。 谢谢 ,供上code:

     BeginCode

    复制代码
       /// <summary>
            /// 大量数据导出
            /// </summary>
            /// <param name="table"></param>
            /// <param name="saveFileName"></param>
            public static void ExportToExcel(System.Data.DataTable table, string saveFileName)
            {
                try
                {
                    if (table == null)
                    {
                        return;
                    }
                    bool fileSaved = false;
    
                    //ExcelApp xlApp = new ExcelApp();
    
                    Application xlApp = new Application();
    
                    if (xlApp == null)
                    {
                        return;
                    }
    
                    Workbooks workbooks = xlApp.Workbooks;
                    Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                    Worksheet worksheet = (Worksheet)workbook.Worksheets[1];//取得sheet1
    
                    long rows = table.Rows.Count;
    
                    /*下边注释的两行代码当数据行数超过行时,出现异常:异常来自HRESULT:0x800A03EC。因为:Excel 2003每个sheet只支持最大行数据
    
                    //Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count+2, gridview.Columns.View.VisibleColumns.Count+1]);
    
                    //fchR.Value2 = datas;*/
    
                    if (rows > 65535)
                    {
    
                        long pageRows = 60000;//定义每页显示的行数,行数必须小于
    
                        int scount = (int)(rows / pageRows);
    
                        if (scount * pageRows < table.Rows.Count)//当总行数不被pageRows整除时,经过四舍五入可能页数不准
                        {
                            scount = scount + 1;
                        }
    
                        for (int sc = 1; sc <= scount; sc++)
                        {
                            if (sc > 1)
                            {
    
                                object missing = System.Reflection.Missing.Value;
    
                                worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(
    
                               missing, missing, missing, missing);//添加一个sheet
    
                            }
    
                            else
                            {
                                worksheet = (Worksheet)workbook.Worksheets[sc];//取得sheet1
                            }
    
                            string[,] datas = new string[pageRows + 1, table.Columns.Count + 1];
    
    
                            for (int i = 0; i < table.Columns.Count; i++) //写入字段
                            {
                                datas[0, i] = table.Columns[i].Caption;
                            }
    
                            Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, table.Columns.Count]);
                            range.Interior.ColorIndex = 15;//15代表灰色
                            range.Font.Bold = true;
                            range.Font.Size = 9;
    
                            int init = int.Parse(((sc - 1) * pageRows).ToString());
                            int r = 0;
                            int index = 0;
                            int result;
    
                            if (pageRows * sc >= table.Rows.Count)
                            {
                                result = table.Rows.Count;
                            }
                            else
                            {
                                result = int.Parse((pageRows * sc).ToString());
                            }
                            for (r = init; r < result; r++)
                            {
                                index = index + 1;
                                for (int i = 0; i < table.Columns.Count; i++)
                                {
                                    if (table.Columns[i].DataType == typeof(string) || table.Columns[i].DataType == typeof(Decimal) || table.Columns[i].DataType == typeof(DateTime) || table.Columns[i].DataType == typeof(int) || table.Columns[i].DataType == typeof(double))
                                    {
                                        object obj = table.Rows[r][table.Columns[i].ColumnName];
                                        datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
    
                                    }
    
                                }
                            }
    
                            Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 2, table.Columns.Count + 1]);
    
                            fchR.Value2 = datas;
                            worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
    
                            range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, table.Columns.Count]);
    
                            //15代表灰色
    
                            range.Font.Size = 9;
                            range.RowHeight = 14.25;
                            range.Borders.LineStyle = 1;
                            range.HorizontalAlignment = 1;
    
                        }
    
                    }
    
                    else
                    {
    
                        string[,] datas = new string[table.Rows.Count + 2, table.Columns.Count + 1];
                        for (int i = 0; i < table.Columns.Count; i++) //写入字段         
                        {
                            datas[0, i] = table.Columns[i].Caption;
                        }
    
                        Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, table.Columns.Count]);
                        range.Interior.ColorIndex = 15;//15代表灰色
                        range.Font.Bold = true;
                        range.Font.Size = 9;
    
                        int r = 0;
                        for (r = 0; r < table.Rows.Count; r++)
                        {
                            for (int i = 0; i < table.Columns.Count; i++)
                            {
                                if (table.Columns[i].DataType == typeof(string) || table.Columns[i].DataType == typeof(Decimal) || table.Columns[i].DataType == typeof(DateTime))
                                {
                                    object obj = table.Rows[r][table.Columns[i].ColumnName];
                                    datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
    
                                }
    
                            }
    
                            //System.Windows.Forms.Application.DoEvents();
    
    
                        }
    
                        Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count + 2, table.Columns.Count + 1]);
    
                        fchR.Value2 = datas;
    
                        worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
    
                        range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count + 1, table.Columns.Count]);
    
                        //15代表灰色
    
                        range.Font.Size = 9;
                        range.RowHeight = 14.25;
                        range.Borders.LineStyle = 1;
                        range.HorizontalAlignment = 1;
                    }
    
                    if (saveFileName != "")
                    {
                        try
                        {
                            workbook.Saved = true;
                            workbook.SaveCopyAs(saveFileName);
                            fileSaved = true;
    
                        }
    
                        catch (Exception ex)
                        {
                            fileSaved = false;
                        }
    
                    }
    
                    else
                    {
    
                        fileSaved = false;
    
                    }
    
                    xlApp.Quit();
    
                    GC.Collect();//强行销毁   
                    //web后台谈框框,winform可以使用messagebox.. 大家都懂的
                    System.Web.HttpContext.Current.Response.Write("<Script Language=JavaScript>...alert('Export Success! File path in D disk root directory.');</Script>");
                }
                catch (Exception)
                {
                    System.Web.HttpContext.Current.Response.Write("<Script Language=JavaScript>...alert('Export Error! please contact administrator!');</Script>");
                }
            }
    复制代码


    EndCode

         ok,就这么多了,传递一个DataTable 和一个保存文件的路径即可实现,执行效果如下:(该图为30W条数据在Office 2007上的测试效果,没有计量执行时间,不过也就喝完一口水,在盖上盖子的时间) :)

         

    图片二:

    为了不想蹲局子,我小心翼翼的把敏感数据A掉,我突然发现QQ截图功能弱爆了,还是window自带的截图爽~~

    ok就到这里,有错误的地方,敬请拍砖,期待砖砖砸脸  谢谢  再会~~


    作者:阿星 
    出处:http://www.cnblogs.com/axing/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    LeetCode 1
    Thinking in Java学习杂记(第7章)
    工程优化部分概念
    Thinking in Java学习杂记(5-6章)
    Thinking in Java学习杂记(1-4章)
    python中map()和dict()的用法
    JavaWeb高级编程(下篇)
    对CSDN的理性吐槽
    CSDN博客已经打不开了
    大连交大教务一键教学评价
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2518712.html
Copyright © 2011-2022 走看看