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

图片二:

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

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

转载于:https://www.cnblogs.com/axing/archive/2012/05/25/Excel-65535.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. 图灵奖得主LeCun亲授,深度学习课程在线发布|资源
  2. 我用 PyTorch 复现了 LeNet-5 神经网络(CIFAR10 数据集篇)!
  3. Linux/unix 查看端口占用
  4. qt ui指针和本类对象_您需要了解的有关UI设计的形状和对象的所有信息
  5. python调用远程js_python和js交互调用的方法
  6. 面经——嵌入式芯片底层
  7. img 转esxi vmdk_KVM qcow2、raw、vmdk等镜像格式和转换
  8. libxml2交叉编译
  9. php bootstrap 后台管理系统,bootstrap后台管理系统
  10. windows下安装apache
  11. 《类》《this指针》《构造函数》《析构函数》《拷贝构造函数》《赋值运算符重载》
  12. python画汤姆猫_python汤姆猫小游戏源代码免费下载
  13. 重学JavaWeb —— JSP,简单全面一发入魂
  14. APP静默安装卸载管理器实现与上架到应用宝和豌豆荚
  15. m3u8转换为mp4格式
  16. 中古消费热潮下,爆爆奢漫步二奢直播新时代
  17. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》
  18. 关于Java开发环境
  19. 股指期货高频数据机器学习预测
  20. ci/cd自动化测试_自动化CI / CD并花费更多时间编写代码

热门文章

  1. HTML5 颜色及透明度
  2. 修改linu主机名后 启动tomcat服务报Unable to set localhost. This prevents creation of a GUID. Cause was: qudaogua
  3. 主角把异能开发计算机,不容错过的超能力游戏,最厉害的甚至能操控时间!
  4. 「Android高级工程师」BAT大厂面试基础题集合-下 Github标星6.5K
  5. Python调用百度API进行人像动漫化
  6. Linux_加密和安全详细介绍
  7. 全球行业品牌“中国制冷展”将亮相汉渝 寻觅发展新空间
  8. python深浅拷贝应用_简述Python的深浅拷贝以及应用场景?
  9. smartbi和第三方集成策略
  10. 《Multi-Stream Gated and Pyramidal Temporal Convolutional Neural Networksfor Audio-Visual Speech Se》