对于用com组件写excel,笔者表示那个太慢了。而且很耗资源,还要装excel。

今天我们就用写文本文件的方式来写excel。

步骤1,用excel写好一个设计一个我们想要的模板。

步骤2,我们把做好的excel模板,另存为。 这时会出现另存为的对话框。在保存类型中选择“XML 电子表格 2003 (*.xml)”。然后名字随便写。

步骤3,把我们刚保存的xml文件用文本打开。我们就会看到,其实excel是以xml方式存放的数据。如果这时你用excel打开那个xml文件,会发现excel出现的就是我们刚才的设计的模板。而且格式和我们设计的一样。

步骤4,所以我们可以用写xml,或者文本的方式写excel,只要符合我们刚才保存的那个xml格式。然后文件的后缀名改成xls就OK了。 而这个写的速度超快。


说完了上面的方法我们用代码把它实现吧。笔者主要编程语言为c#。所以就用c#封装了个写excel的类。代码如下

  1. public class ExcelHelper
  2. {
  3. private Excel.Application oExcel = null;
  4. private Excel.Workbook oBook = null;
  5. private Excel.Worksheet oSheet = null;
  6. private Excel.Range oRange = null;
  7. public ExcelHelper()
  8. {
  9. oExcel = new Excel.Application();
  10. oBook = oExcel.Application.Workbooks.Add(true);
  11. oSheet = (Excel.Worksheet)oBook.ActiveSheet;
  12. }
  13. /// <summary>
  14. /// 向excel写入文本(如向“A1”写入文字:InsertText("A1",要填入的文字))
  15. /// </summary>
  16. /// <param name="val_range">单元格</param>
  17. /// <param name="val_text">文本</param>
  18. public void InsertText(string val_range, string val_text)
  19. {
  20. oRange = oSheet.Range[val_range];
  21. oRange.Value = val_text;
  22. }
  23. /// <summary>
  24. /// 向excel写入文本
  25. /// </summary>
  26. /// <param name="val_range">单元格</param>
  27. /// <param name="val_text">文本</param>
  28. /// <param name="val_fontSize">字体大小</param>
  29. public void InsertText(string val_range, string val_text, float val_fontSize)
  30. {
  31. oRange = oSheet.Range[val_range];
  32. oRange.Value = val_text;
  33. oRange.Font.Size = val_fontSize;
  34. }
  35. /// <summary>
  36. /// 向excel写入文本(如向“B1”写入文字:InsertText(1,2,要填入的文字))
  37. /// </summary>
  38. /// <param name="val_i">行号</param>
  39. /// <param name="val_j">列号</param>
  40. /// <param name="val_text">文本</param>
  41. public void InsertText(int val_i, int val_j, string val_text)
  42. {
  43. oRange = (Excel.Range)oSheet.Cells[val_i, val_j];
  44. oRange.Value = val_text;
  45. }
  46. /// <summary>
  47. /// 向excel写入文本(如向“B1”写入文字:InsertText(1,2,要填入的文字,字体大小))
  48. /// </summary>
  49. /// <param name="val_i">行号</param>
  50. /// <param name="val_j">列号</param>
  51. /// <param name="val_text">文本</param>
  52. /// <param name="val_fontSize">字体大小</param>
  53. public void InsertText(int val_i, int val_j, string val_text, float val_fontSize)
  54. {
  55. oRange = oSheet.Cells[val_i, val_j];
  56. oRange.Value = val_text;
  57. oRange.Font.Size = val_fontSize;
  58. }
  59. /// <summary>
  60. /// 读取excel文本项(如读取“B1”的文字:ReadText("B1"))
  61. /// </summary>
  62. /// <param name="val_range">单元格</param>
  63. /// <returns></returns>
  64. public string ReadText(string val_range)
  65. {
  66. oRange = oSheet.Range[val_range];
  67. return oRange.Text.ToString();
  68. }
  69. /// <summary>
  70. /// 读取excel文本项(如读取“A1”的文字:ReadText(1,1))
  71. /// </summary>
  72. /// <param name="val_i">行号</param>
  73. /// <param name="val_j">列号</param>
  74. /// <returns></returns>
  75. public string ReadText(int val_i, int val_j)
  76. {
  77. oRange = oSheet.Cells[val_i, val_j];
  78. return oRange.Text.ToString();
  79. }
  80. /// <summary>
  81. /// 合并单元格
  82. /// </summary>
  83. /// <param name="x1">行号</param>
  84. /// <param name="y1">列号</param>
  85. /// <param name="x2">行号</param>
  86. /// <param name="y2">列号</param>
  87. public void MerMergeCells(int x1, int y1, int x2, int y2)
  88. {
  89. oSheet.Range[oSheet.Cells[x1, y1], oSheet.Cells[x2, y2]].Merge();
  90. }
  91. /// <summary>
  92. /// 设置excel列的默认样式
  93. /// </summary>
  94. public void SetColumnDefaultStyle()
  95. {
  96. oSheet.Columns.EntireColumn.AutoFit();
  97. oSheet.Columns.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
  98. }
  99. /// <summary>
  100. /// 保存excel文件(如要将excel保存到D:\test.xls:SaveAs)
  101. /// </summary>
  102. /// <param name="val_saveAsFilePath">文件路径</param>
  103. /// <returns></returns>
  104. public bool SaveAs(string val_saveAsFilePath)
  105. {
  106. try
  107. {
  108. oSheet.SaveAs(val_saveAsFilePath);
  109. return true;
  110. }
  111. catch
  112. {
  113. return false;
  114. }
  115. }
  116. public bool Print()
  117. {
  118. try
  119. {
  120. oSheet.PrintOut();
  121. return true;
  122. }
  123. catch
  124. {
  125. return false;
  126. }
  127. }
  128. /// <summary>
  129. /// 自动释放excel资源
  130. /// </summary>
  131. public void Dispose()
  132. {
  133. if (oExcel != null)
  134. {
  135. oExcel.Workbooks.Close();
  136. oExcel.Quit();
  137. KillAllExcel();
  138. oExcel = null;
  139. }
  140. if (oBook != null)
  141. {
  142. oBook = null;
  143. }
  144. if (oSheet != null)
  145. {
  146. oSheet = null;
  147. }
  148. if (oRange != null)
  149. {
  150. oRange = null;
  151. }
  152. GC.Collect();
  153. }
  154. /// <summary>
  155. /// 获取所有excel进程
  156. /// </summary>
  157. /// <returns></returns>
  158. private static List<Process> GetExcelProcesses()
  159. {
  160. Process[] processes = Process.GetProcesses();
  161. List<Process> excelProcesses = new List<Process>();
  162. for (int i = ; i < processes.Length; i++)
  163. {
  164. if (processes[i].ProcessName.ToUpper() == "EXCEL")
  165. excelProcesses.Add(processes[i]);
  166. }
  167. return excelProcesses;
  168. }
  169. /// <summary>
  170. /// 杀死所有Excel进程
  171. /// </summary>
  172. private static void KillAllExcel()
  173. {
  174. List<Process> excelProcesses = GetExcelProcesses();
  175. for (int i = ; i < excelProcesses.Count; i++)
  176. {
  177. excelProcesses[i].Kill();
  178. }
  179. }
  180. /// <summary>
  181. /// DataTable导出Excel
  182. /// </summary>
  183. /// <param name="sFileName"></param>
  184. /// <param name="dt"></param>
  185. public void DataTableToExcel(string fileName, DataTable dt)
  186. {
  187. int CurrentCol = ;//当前列
  188. int RowCount = dt.Rows.Count + ;//总行数
  189. int ColCount = dt.Columns.Count;//总列数
  190. StreamWriter sw = new StreamWriter(fileName, false);//文件如果存在,则自动覆盖
  191. try
  192. {
  193. #region XML头部
  194. sw.WriteLine("<?xml version=\"1.0\"?>");
  195. sw.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>");
  196. sw.WriteLine("<Workbook");
  197. sw.WriteLine("xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
  198. sw.WriteLine("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">");
  199. sw.WriteLine("\t<Styles>");
  200. sw.WriteLine("\t\t<Style ss:ID=\"Default\" ss:Name=\"Normal\"><Alignment ss:Vertical=\"Center\"/><Font ss:FontName=\"宋体\" ss:Size=\"12\"/></Style>");
  201. sw.WriteLine("\t\t<Style ss:ID=\"s47\"><Font ss:FontName=\"宋体\" ss:Size=\"11\" ss:Color=\"#000000\"/><Interior ss:Color=\"#EBF1DE\" ss:Pattern=\"Solid\"/></Style>");
  202. sw.WriteLine("\t\t<Style ss:ID=\"s33\"><Borders><Border ss:Position=\"Bottom\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Left\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Right\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Top\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/></Borders><Font ss:FontName=\"宋体\" ss:Size=\"11\" ss:Color=\"#FFFFFF\" ss:Bold=\"1\"/><Interior ss:Color=\"#A5A5A5\" ss:Pattern=\"Solid\"/></Style>");
  203. sw.WriteLine("\t\t<Style ss:ID=\"s68\" ss:Parent=\"s33\"><Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\"/></Style>");
  204. sw.WriteLine("\t\t<Style ss:ID=\"s93\" ss:Parent=\"s47\"><Borders><Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Left\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Right\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Top\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/></Borders></Style>");
  205. sw.WriteLine("\t</Styles>");
  206. sw.WriteLine("\t<Worksheet ss:Name=\"Sheet1\">");
  207. sw.WriteLine("\t\t<Table ss:DefaultColumnWidth=\"150\" ss:DefaultRowHeight=\"20\">");
  208. #endregion
  209.  
  210. #region excel标题
  211. sw.WriteLine("\t\t\t<Row>");
  212. sw.WriteLine("\t\t\t\t<Cell ss:MergeAcross=\"{0}\" ss:StyleID=\"s68\">",ColCount-);
  213. sw.WriteLine("\t\t\t\t\t<Data ss:Type=\"String\">{0}</Data>",dt.TableName);
  214. sw.WriteLine("\t\t\t\t</Cell>");
  215. sw.WriteLine("\t\t\t</Row>");
  216. #endregion
  217.  
  218. #region excel表头信息
  219. sw.WriteLine("\t\t\t<Row ss:AutoFitHeight=\"0\" ss:Height=\"15\">");
  220. for (CurrentCol = ; CurrentCol < ColCount; CurrentCol++)
  221. {
  222. sw.Write("\t\t\t\t<Cell ss:StyleID=\"s93\"><Data ss:Type=\"String\">{0}</Data></Cell>", dt.Columns[CurrentCol].ColumnName.ToString().Trim());
  223. }
  224. sw.WriteLine("\t\t\t</Row>");
  225. #endregion
  226.  
  227. #region excel表格内容
  228. foreach (DataRow row in dt.Rows)
  229. {
  230. sw.WriteLine("\t\t\t<Row ss:AutoFitHeight=\"0\" ss:Height=\"15\">");
  231. for (CurrentCol = ; CurrentCol < ColCount; CurrentCol++)
  232. {
  233. sw.Write("\t\t\t\t<Cell ss:StyleID=\"s93\"><Data ss:Type=\"String\">");
  234. if (row[CurrentCol] != null)
  235. {
  236. sw.Write(row[CurrentCol].ToString().Trim());
  237. }
  238. else
  239. {
  240. sw.Write("");
  241. }
  242. sw.Write("</Data></Cell>");
  243. }
  244. sw.WriteLine("\t\t\t</Row>");
  245. }
  246. #endregion
  247.  
  248. #region XML尾部
  249. sw.WriteLine("\t\t</Table>");
  250. sw.WriteLine("\t</Worksheet>");
  251. sw.WriteLine("</Workbook>");
  252. #endregion
  253. }
  254. catch
  255. { }
  256. finally
  257. {
  258. sw.Close();
  259. sw = null;
  260. }
  261. }
  262. }

快速写excel的方法的更多相关文章

  1. HTML5快速写页面的方法

    1 如果有原型的HTML页面(Axure导出来),可以在此从F12的“查看器”基础上拷贝到一个新文件,继续写代码. 2 利用EditPlus软件的工具 3 使用Dreamweaver CS5,可以直观 ...

  2. 快速写一个babel插件

    es6/7/8的出现,给我们带来了很多方便,但是浏览器并不怎么支持,目前chrome应该是支持率最高的,所以为了兼容我们只能把代码转成es5,这应该算是我们最初使用babel的一个缘由,随着业务的开发 ...

  3. IDEA最常用快捷键汇总+快速写出Main函数

    IDEA可以说是当下Java程序员日常开发的神器,但是想要发挥这款神器的牛逼威力,必须得熟练使用它的各种快捷键才行.本篇总结下使用IDEA(也就是IntelliJ IDEA )进行日常开发中最常用的快 ...

  4. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  5. MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

    导出EXCEL方法总结 MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可: 优点:可设置丰富的EXC ...

  6. HTML Table导出为Excel的方法

    HTML Table导出为Excel的方法: 直接上源码 <html> <head> <meta http-equiv="Content-Type" ...

  7. VBS操作Excel常见方法

    VBS操作Excel常见方法 作者: 字体:[增加 减小] 类型:转载 时间:2009-11-13我要评论 VBS控制Excel常见方法,需要的朋友可以参考下. dim oExcel,oWb,oShe ...

  8. asp.net中导出Excel的方法

    一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...

  9. ASP.NET导出excel表方法汇总

    asp.net里导出excel表方法汇总  1.由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) ...

随机推荐

  1. 在JQuery中获取URL中的参数值

    添加一个js文件,代码如下 // * jQuery url get parameters function [获取URL的GET参数值] // *character_set UTF-8 // * au ...

  2. git版本库管理介绍,撤销git pull操作

    Git是分布式版本控制系统,GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心. 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实 ...

  3. VS:"64位调试操作花费的时间比预期要长"的一解决途径

    解决办法之一: 在命令提示符那里打入如下命令: netsh winsock reset catalognetsh int ip reset reset.log hit 重启电脑后,即可

  4. aop注解 自定义切面的注解写法

    spring.xml中 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...

  5. 关于iOS 热更新(热修复)你必须知道的一种方法- JSPatch

    本文为转载文章 . 版权归原文所有. 原文链接:iOS 5分钟集成热修复(JSPatch) 前言 在iOS中有很多种热修复方案,在这里我就不一一介绍了 这里有一篇介绍热修复的文章:iOS中的HotFi ...

  6. 搭建前端vue环境,安装vue-cli遇到Please try running this command again as root/Administrator的解决方案

    最近在搭前端环境,装完node.js之后,准备安装vue工程的初始化工具时(npm install -g vue-cli),遇到这个坑: 大体的意思就是权限问题,导致/usr/local/lib/no ...

  7. centos7安装MySQL5.7无法设置密码问题

    前言 在使用centos7系统yum方式安装MySQL5.7后 不知道默认密码是多少  知道后没办法修改? 一.找到MySQL密码 service mysqld start vim /var/log/ ...

  8. js出现Syntax error on token "catch", Identifier expected

    本文转自:http://blog.csdn.net/u011159417/article/details/73916676 项目中需要使用jQuery,因此下载了jQuery的js包jquery-3. ...

  9. IOS开发之瀑布流照片墙实现

    想必大家已经对互联网传统的照片布局方式司空见惯了,这种行列分明的布局虽然对用户来说简洁明了,但是长久的使用难免会产生审美疲劳.现在网上流行一种叫做“瀑布流”的照片布局样式,这种行与列参差不齐的状态着实 ...

  10. $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别

    当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件.ready() 函数仅能用于当前文档,因此无需选择器.所以document选择器可以不要,那么就可以 ...