大量数据导出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];//取得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 之 多重影分身之术相关推荐
- 量数据导出Excel 之 多重影分身之术
刚才准备写这个文章的时候,看到同事发来的群消息,我邪恶了. 我相信看到这篇文章的人 都比较纯,我就跟大家分享一下吧! 主要内容:现在因为需求变化,公司需要一台服务器做中转,公司一MM 准备了一台普通P ...
- 将页面中表格数据导出excel格式的文件(vue)
近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...
在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...
- Controller数据导出Excel 详细教程——easypoi-base,easypoi-web,easypoi-annotation
Controller获取数据导出Excel,详细教程 1:导入对应依赖 <dependency><groupId>cn.afterturn</groupId>< ...
- DataTable中的数据导出Excel文件
DataTable中的数据导出Excel文件 View Code ///<summary> /// 将DataTable中的数据导出到指定的Excel文件中 ///</summary ...
- php数据的导出到excel,php 数据的导出到excel表格-怎么将php数据导出excel
怎么使用php把表格中的数据导入到excel中 下面写的一个PHP导出数据到CSV问价的函数,你到时候直接调用了 /** * 导出CSV * @param string $fileName文件名字 * ...
- 大量数据导出Excel方案
序 最近可能会遇到大量数据导出Excel的场景,今天趁现在需求告一段落来做下技术预研,然后这里就顺便分享给大家. 一.数据量预判 因为我们是做物联网的,这里要导出的数据就是设备的上报数据.客户说要这些 ...
- 在vue中把数据导出Excel文件
在vue中把数据导出Excel文件 第一次尝试写文章 在vue中把数据导出成Excel格式的文件,话不多,上代码: 第一步我们要先安装几个集成的插件 npm install -S file-saver ...
- JSON数据导出Excel表
JSON数据导出Excel表 应老板要求写了一个实用的小功能,需求是将api接口返回的JSON数据导出Excel表,过程中改了两稿,一是前端js直接导出一个表,另一是分门别类在java中同时导出多个表 ...
- java批量文件打包成压缩成zip下载和大量数据导出excel时的处理方法
对于我们来说,java导出数据成excel或其他数据文件,或者下载资源是开发中的家常便饭, 但是在导出的时候,如果点击一个按钮导出几百万条数据,如果不作处理的话很可能会出现一系列的问题. 这里介绍打包 ...
最新文章
- 图灵奖得主LeCun亲授,深度学习课程在线发布|资源
- 我用 PyTorch 复现了 LeNet-5 神经网络(CIFAR10 数据集篇)!
- Linux/unix 查看端口占用
- qt ui指针和本类对象_您需要了解的有关UI设计的形状和对象的所有信息
- python调用远程js_python和js交互调用的方法
- 面经——嵌入式芯片底层
- img 转esxi vmdk_KVM qcow2、raw、vmdk等镜像格式和转换
- libxml2交叉编译
- php bootstrap 后台管理系统,bootstrap后台管理系统
- windows下安装apache
- 《类》《this指针》《构造函数》《析构函数》《拷贝构造函数》《赋值运算符重载》
- python画汤姆猫_python汤姆猫小游戏源代码免费下载
- 重学JavaWeb —— JSP,简单全面一发入魂
- APP静默安装卸载管理器实现与上架到应用宝和豌豆荚
- m3u8转换为mp4格式
- 中古消费热潮下,爆爆奢漫步二奢直播新时代
- 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》
- 关于Java开发环境
- 股指期货高频数据机器学习预测
- ci/cd自动化测试_自动化CI / CD并花费更多时间编写代码
热门文章
- HTML5 颜色及透明度
- 修改linu主机名后 启动tomcat服务报Unable to set localhost. This prevents creation of a GUID. Cause was: qudaogua
- 主角把异能开发计算机,不容错过的超能力游戏,最厉害的甚至能操控时间!
- 「Android高级工程师」BAT大厂面试基础题集合-下 Github标星6.5K
- Python调用百度API进行人像动漫化
- Linux_加密和安全详细介绍
- 全球行业品牌“中国制冷展”将亮相汉渝 寻觅发展新空间
- python深浅拷贝应用_简述Python的深浅拷贝以及应用场景?
- smartbi和第三方集成策略
- 《Multi-Stream Gated and Pyramidal Temporal Convolutional Neural Networksfor Audio-Visual Speech Se》