刚才准备写这个文章的时候,看到同事发来的群消息,我邪恶了。 我相信看到这篇文章的人 都比较纯,我就跟大家分享一下吧! 主要内容:现在因为需求变化,公司需要一台服务器做中转,公司一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];//取得sheet1long 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上的测试效果,没有计量执行时间,不过也就喝完一口水,在盖上盖子的时间) :)

图片二:

转载于:https://www.cnblogs.com/bluedy1229/articles/2518530.html

大量数据导出Excel 之 多重影分身之术 [转]相关推荐

  1. 量数据导出Excel 之 多重影分身之术

    刚才准备写这个文章的时候,看到同事发来的群消息,我邪恶了. 我相信看到这篇文章的人 都比较纯,我就跟大家分享一下吧! 主要内容:现在因为需求变化,公司需要一台服务器做中转,公司一MM 准备了一台普通P ...

  2. 将页面中表格数据导出excel格式的文件(vue)

    近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...

  3. Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...

    在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...

  4. Controller数据导出Excel 详细教程——easypoi-base,easypoi-web,easypoi-annotation

    Controller获取数据导出Excel,详细教程 1:导入对应依赖 <dependency><groupId>cn.afterturn</groupId>< ...

  5. DataTable中的数据导出Excel文件

    DataTable中的数据导出Excel文件 View Code ///<summary> /// 将DataTable中的数据导出到指定的Excel文件中 ///</summary ...

  6. php数据的导出到excel,php 数据的导出到excel表格-怎么将php数据导出excel

    怎么使用php把表格中的数据导入到excel中 下面写的一个PHP导出数据到CSV问价的函数,你到时候直接调用了 /** * 导出CSV * @param string $fileName文件名字 * ...

  7. 大量数据导出Excel方案

    序 最近可能会遇到大量数据导出Excel的场景,今天趁现在需求告一段落来做下技术预研,然后这里就顺便分享给大家. 一.数据量预判 因为我们是做物联网的,这里要导出的数据就是设备的上报数据.客户说要这些 ...

  8. 在vue中把数据导出Excel文件

    在vue中把数据导出Excel文件 第一次尝试写文章 在vue中把数据导出成Excel格式的文件,话不多,上代码: 第一步我们要先安装几个集成的插件 npm install -S file-saver ...

  9. JSON数据导出Excel表

    JSON数据导出Excel表 应老板要求写了一个实用的小功能,需求是将api接口返回的JSON数据导出Excel表,过程中改了两稿,一是前端js直接导出一个表,另一是分门别类在java中同时导出多个表 ...

  10. java批量文件打包成压缩成zip下载和大量数据导出excel时的处理方法

    对于我们来说,java导出数据成excel或其他数据文件,或者下载资源是开发中的家常便饭, 但是在导出的时候,如果点击一个按钮导出几百万条数据,如果不作处理的话很可能会出现一系列的问题. 这里介绍打包 ...

最新文章

  1. 监管AI?吴恩达跟马斯克想到一块去了
  2. 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课
  3. 疯狂ios讲义疯狂连载之实现游戏视图控制器
  4. 如何安装pylab:python如何导入matplotlib模块
  5. 检查电脑是否被安装木马三个小命令
  6. sqlite3 交叉编译出现configure: error: C compiler cannot create executables
  7. python中的scipy基础知识_Python机器学习(五十二)SciPy 基础功能
  8. 正在将错误信息上传至服务器,android - 将Base64编码的图像上传到服务器-400服务器错误 - 堆栈内存溢出...
  9. 力扣-746. 使用最小花费爬楼梯
  10. 《软件工程》总结——第四章
  11. java batik_batik详解2
  12. IOS测试的一般流程和注意事项
  13. Janusgraph事务
  14. 插入法排序(c语言)
  15. arcgis 删除创建的自定义地理变换文件
  16. 3d打印技术与计算机,讲述3D打印技术是如何实现打印的,与普通的打印有何不同...
  17. 热修复——深入浅出原理与实现
  18. 前端、vue、Vue3弹幕实现;前端CSS实现弹幕
  19. 初始mysql(3w)
  20. Git中文件夹灰色无法打开问题解决

热门文章

  1. php定义一个矩形类rectangle,Python3面向对象—点和矩形类
  2. 基于yolov3的水下目标检测(百度飞浆实现)
  3. Excel自动化教程之通过python将Excel与Word集成无缝生成自动报告
  4. 2021年江西省安全员C证考试报名及江西省安全员C证模拟考试题库
  5. 一行python代码能实现什么丧心病狂的功能_一行Python 能实现什么丧心病狂的功能...
  6. MOVE-CORRESPONDING
  7. 第12课:(2)线性回归建模实验
  8. 小程序心知天气API获取数据
  9. python知识:装饰器@property有啥用途?
  10. civil3D地形导入AIW(设置投影坐标系)