1.组件原理

excel的数据存储是以xml格式存储的,所以导出Excel文件可以通过生成XML来实现。当然XML必须符合一定的格式要求。

2.组件实现

(1)新建类库文件“MyExcel”

(2)添加类型“WorkBook”,这里指Excel的工作表。

  1. namespace MyExcel
  2. {
  3. public class WorkBook
  4. {
  5. private StringBuilder excelstr;
  6. private List<WorkSheet> sheets;
  7. public WorkBook()
  8. {
  9. this.excelstr = new StringBuilder();
  10. this.sheets = new List<WorkSheet>();
  11. }
  12. public WorkSheet CreateSheet(string title)
  13. {
  14. if (sheets == null)
  15. {
  16. throw new Exception("只有先构建WorkBook对象后才能构建WorkSheet对象!");
  17. }
  18. foreach (WorkSheet sht in sheets)
  19. {
  20. if (sht.Title.ToLower() == title.ToLower())
  21. {
  22. throw new Exception("已经有名称为:" + title + " 的Sheet");
  23. }
  24. }
  25. WorkSheet wsheeet = new WorkSheet(title);
  26. this.sheets.Add(wsheeet);
  27. return wsheeet;
  28. }
  29. private string WriteWorkBook()
  30. {
  31. if (sheets == null || sheets.Count < )
  32. {
  33. throw new Exception("只有先构建WorkBook对象后才能构建行对象!");
  34. }
  35. excelstr.Append("<?xml version=\"1.0\"?>\r\n");
  36. excelstr.Append("<?mso-application progid=\"Excel.Sheet\"?>\r\n");
  37. excelstr.Append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n");
  38. excelstr.Append("xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n");
  39. excelstr.Append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\r\n");
  40. excelstr.Append("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n");
  41. excelstr.Append("xmlns:html=\"http://www.w3.org/TR/REC-html40\">\r\n");
  42. excelstr.Append("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">\r\n");
  43. excelstr.Append("<Created>2006-09-16T00:00:00Z</Created>\r\n");
  44. excelstr.Append("<LastSaved>2015-07-07T05:50:29Z</LastSaved>\r\n");
  45. excelstr.Append("<Version>14.00</Version>\r\n");
  46. excelstr.Append("</DocumentProperties>\r\n");
  47. excelstr.Append("<OfficeDocumentSettings xmlns=\"urn:schemas-microsoft-com:office:office\">\r\n");
  48. excelstr.Append("<AllowPNG/>\r\n");
  49. excelstr.Append("<RemovePersonalInformation/>\r\n");
  50. excelstr.Append("</OfficeDocumentSettings>\r\n");
  51. excelstr.Append("<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n");
  52. excelstr.Append("<WindowHeight>8010</WindowHeight>\r\n");
  53. excelstr.Append("<WindowWidth>14805</WindowWidth>\r\n");
  54. excelstr.Append("<WindowTopX>240</WindowTopX>\r\n");
  55. excelstr.Append("<WindowTopY>105</WindowTopY>\r\n");
  56. excelstr.Append("<ProtectStructure>False</ProtectStructure>\r\n");
  57. excelstr.Append("<ProtectWindows>False</ProtectWindows>\r\n");
  58. excelstr.Append("</ExcelWorkbook>\r\n");
  59. excelstr.Append("<Styles>\r\n");
  60. excelstr.Append("<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n");
  61. excelstr.Append("<Alignment ss:Vertical=\"Bottom\"/>\r\n");
  62. excelstr.Append("<Borders/>\r\n");
  63. excelstr.Append("<Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"11\" ss:Color=\"#000000\"/>\r\n");
  64. excelstr.Append("<Interior/>\r\n");
  65. excelstr.Append("<NumberFormat/>\r\n");
  66. excelstr.Append("<Protection/>\r\n");
  67. excelstr.Append("</Style>\r\n");
  68. excelstr.Append("<Style ss:ID=\"s64\">\r\n");
  69. excelstr.Append("<Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\"/>\r\n");
  70. excelstr.Append("<Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"11\" ss:Color=\"#000000\"\r\n");
  71. excelstr.Append("ss:Bold=\"1\"/>\r\n");
  72. excelstr.Append("</Style>\r\n");
  73. excelstr.Append("</Styles>\r\n");
  74. foreach (WorkSheet item in sheets)
  75. {
  76. excelstr.Append(item.WriteSheet());
  77. }
  78. excelstr.Append("</Workbook>\r\n");
  79. return excelstr.ToString();
  80. }
  81. /// <summary>
  82. /// Write Data To Stream.
  83. /// </summary>
  84. /// <param name="ms"></param>
  85. public void WriteStream(Stream ms)
  86. {
  87. try
  88. {
  89. string msg = WriteWorkBook();
  90. byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
  91. ms.Write(buffer, , buffer.Length);
  92.  
  93. }
  94. catch (Exception)
  95. {
  96. throw new Exception("写入流错误");
  97. }
  98.  
  99. }
  100. }
  101. }

(3)添加类型“WorkSheet”,这里指Excel的工作簿。

  1. namespace MyExcel
  2. {
  3. public class WorkSheet
  4. {
  5. private List<Row> rowcollection;
  6. private string title = "";
  7. internal WorkSheet(string title)
  8. {
  9. this.title = title;
  10. this.rowcollection = new List<Row>();
  11. }
  12. internal string Title
  13. { get { return title; } }
  14. public Row CreateRow()
  15. {
  16. Row _row = new Row();
  17. if (this.rowcollection == null)
  18. {
  19. throw new Exception("只有先构建Sheet对象后才能构建行对象!");
  20. }
  21. rowcollection.Add(_row);
  22. return _row;
  23. }
  24.  
  25. internal string WriteSheet()
  26. {
  27. if (rowcollection == null || rowcollection.Count < )
  28. {
  29. throw new Exception("未添加行(Row)对象");
  30. }
  31. StringBuilder sb = new StringBuilder();
  32. sb.Append(string.Format("<Worksheet ss:Name=\"{0}\">\r\n", title));
  33. sb.Append("<Table ss:ExpandedColumnCount=\"200\" ss:ExpandedRowCount=\"65535\" x:FullColumns=\"1\"\r\n");
  34. sb.Append("x:FullRows=\"1\" ss:DefaultColumnWidth=\"54\" ss:DefaultRowHeight=\"13.5\">\r\n");
  35.  
  36. foreach (Row _row in rowcollection)
  37. {
  38. sb.Append(_row.WriteRow());
  39. }
  40. sb.Append("</Table>\r\n");
  41. sb.Append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n");
  42. sb.Append("<PageSetup>\r\n");
  43. sb.Append("<Header x:Margin=\"0.3\"/>\r\n");
  44. sb.Append("<Footer x:Margin=\"0.3\"/>\r\n");
  45. sb.Append("<PageMargins x:Bottom=\"0.75\" x:Left=\"0.7\" x:Right=\"0.7\" x:Top=\"0.75\"/>\r\n");
  46. sb.Append("</PageSetup>\r\n");
  47. sb.Append("<Print>\r\n");
  48. sb.Append("<ValidPrinterInfo/>\r\n");
  49. sb.Append("<PaperSizeIndex>9</PaperSizeIndex>\r\n");
  50. sb.Append("<HorizontalResolution>600</HorizontalResolution>\r\n");
  51. sb.Append("<VerticalResolution>600</VerticalResolution>\r\n");
  52. sb.Append("</Print>\r\n");
  53. sb.Append("<Selected/>\r\n");
  54. sb.Append("<ProtectObjects>False</ProtectObjects>\r\n");
  55. sb.Append("<ProtectScenarios>False</ProtectScenarios>\r\n");
  56. sb.Append("</WorksheetOptions>\r\n");
  57. sb.Append("</Worksheet>\r\n");
  58. return sb.ToString();
  59. }
  60.  
  61. }
  62. }

(4)添加类型“Row”,这里指Sheet中的行。

  1. namespace MyExcel
  2. {
  3. public class Row
  4. {
  5. private List<string> cells;
  6. private List<string> headers;
  7. internal Row()
  8. {
  9. this.cells = new List<string>();
  10. this.headers = new List<string>();
  11. }
  12. /// <summary>
  13. /// 添加列
  14. /// </summary>
  15. /// <param name="value"></param>
  16. public void AddCell(string value)
  17. {
  18. cells.Add(value);
  19. }
  20. /// <summary>
  21. /// 添加标题
  22. /// </summary>
  23. /// <param name="title"></param>
  24. public void AddHeader(string title)
  25. {
  26. this.headers.Add(title);
  27. }
  28. internal string WriteRow()
  29. {
  30. if (cells == null)
  31. {
  32. if (headers == null)
  33. {
  34. throw new Exception("无单元格,请创建单元格");
  35. }
  36. else
  37. {
  38. if (headers.Count < )
  39. {
  40. throw new Exception("无单元格,请创建单元格");
  41. }
  42. }
  43. }
  44. else
  45. {
  46. if (headers == null)
  47. {
  48. if (cells.Count < )
  49. {
  50. throw new Exception("无单元格,请创建单元格");
  51. }
  52. }
  53. else
  54. {
  55. if (headers.Count < &&cells.Count<)
  56. {
  57. throw new Exception("无单元格,请创建单元格");
  58. }
  59. }
  60. }
  61. StringBuilder sb = new StringBuilder();
  62. if (headers!=null&&headers.Count>)
  63. {
  64. sb.Append("<Row>\r\n");
  65. foreach (string item in headers)
  66. {
  67. sb.Append(string.Format("<Cell ss:StyleID=\"s64\"><Data ss:Type=\"String\">{0}</Data></Cell>\r\n", item));
  68. }
  69. sb.Append("</Row>\r\n");
  70. }
  71. if (cells != null && cells.Count > )
  72. {
  73. sb.Append("<Row>\r\n");
  74. foreach (string item in cells)
  75. {
  76. sb.Append(string.Format("<Cell><Data ss:Type=\"String\">{0}</Data></Cell>\r\n", item));
  77. }
  78. sb.Append("</Row>\r\n");
  79. }
  80. return sb.ToString();
  81. }
  82.  
  83. }
  84.  
  85. }

(5)编译类库文件,生成“MyExcel.dll”文件。

3.组件使用

添加引用,"MyExcel.dll"

(1)web程序使用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using MyExcel;
  8. using System.IO;
  9.  
  10. public partial class Default1 : System.Web.UI.Page
  11. {
  12. protected void Page_Load(object sender, EventArgs e)
  13. {
  14. Response.Clear();
  15. Response.ClearHeaders();
  16. Response.Buffer = true;
  17. WorkBook wb = new WorkBook();//创建工作表
  18. for (int j = ; j < ; j++)
  19. {
  20. WorkSheet ws = wb.CreateSheet("sheet"+(j+));//创建工作簿
  21. Row r = ws.CreateRow();//创建ws的行
  22. r.AddHeader("Name");//添加标题列
  23. r.AddHeader("Sex");//添加标题列
  24. r.AddHeader("Address");//添加标题列
  25.  
  26. for (int i = ; i < ; i++)
  27. {
  28. r = ws.CreateRow();//又创建一新行
  29. r.AddCell("name" + (i + ));//添加列
  30. r.AddCell("sex" + (i + ));//添加列
  31. r.AddCell("address" + (i + ));//添加列
  32. }
  33. }
  34.  
  35. MemoryStream ms = new MemoryStream();
  36. wb.WriteStream(ms);//将xml数据写入内存流
  37. byte[] buffer = ms.ToArray();
  38. ms.Close();
  39. //文件下载代码
  40. Response.AddHeader("Content-Disposition", "attachment;filename=aa.xls");
  41. Response.AddHeader("Contnet-Length", buffer.Length.ToString());
  42. Response.ContentType = "application/ms-excel;charset=utf-8";
  43. Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis");
  44. Response.BinaryWrite(buffer);
  45. }
  46. }

(2)控制台程序

  1. namespace ConsoleApplication1
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //构造工作表对象
  8. WorkBook wb = new WorkBook();
  9. //创建当前工作表的工作簿对象
  10. WorkSheet ws = wb.CreateSheet("sheet1");
  11. //创建当前工作簿的行对象
  12. Row r = ws.CreateRow();
  13. //当前行添加标题列
  14. r.AddHeader("Name");
  15. r.AddHeader("Sex");
  16. r.AddHeader("Address");
  17. for (int i = ; i < ; i++)
  18. {
  19. //创建新行
  20. r = ws.CreateRow();
  21. //添加新行的列
  22. r.AddCell("name" + (i + ));
  23. r.AddCell("sex" + (i + ));
  24. r.AddCell("address" + (i + ));
  25. }
  26. MemoryStream ms = new MemoryStream();
  27. //将数据写入内存流
  28. wb.WriteStream(ms);
  29. byte[] buffer = ms.ToArray();
  30. FileStream fs = new FileStream(@"c:/aaa.xls", FileMode.Create, FileAccess.ReadWrite);
  31. ms.Close();
  32. fs.Write(buffer, , buffer.Length);
  33. fs.Flush();
  34. fs.Close();
  35. Console.Read();
  36.  
  37. }
  38. }
  39. }

自定义Excel导出简易组件的更多相关文章

  1. 6、jeecg 笔记之 自定义excel 模板导出(一)

    1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总是有需要用到自定义 excel 导出模板,下文所用到的皆是 ...

  2. (Excel导出失败)检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失

    在DCOM 中不存在WORD.EXCEL等OFFICE组件   最近在做一个关于office转存PDF的Web项目.开发过程一切顺利. 起初在网上找到一些Word,PPT转PDF的代码.很好用.一切顺 ...

  3. java使用poi自定义excel标题头并导出(springmvc+poi)

    项目使用的是jeecg开源框架(springmvc+spring+hibernate+......等)此代码仅供参考!如有更好的意见或建议可留言. 1 controller 层 /** * excel ...

  4. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  5. 自定义分页Gridview中Excel导出

    先上图,如图所示导出所有查询出的数据 用的是AspNetPager分页控件,这个导出方法,不受分页和gridview列中数据的约束,可以导出您想导出的数据 首先前台页面代码,lblink即为导出exc ...

  6. asp.net(C#) Excel导出类 导出.xls文件

    ---恢复内容开始--- using Microsoft.Office.Interop.Excel; 针对office 2003需添加引用Microsoft   Excel   11.0   Obje ...

  7. 也谈Excel导出

    吐槽 Excel导出在天朝的软件大环境下,差点成为软件开发必备.俺就遇到过,所有报表不提供导出功能,就能不验收的囧事.报表能查看能打印能形成图表已经完美,实在搞不懂导出excel有个毛用,但是公司依靠 ...

  8. Asp.Net 常用工具类之Office—Excel导出(4)

    开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等... 网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Offi ...

  9. C#Excel导出注意事项

    Excel 导出 1.首先在服务器中安装office ,并且要注册2.在组件服务中 设置Microsoft.excel.appliction 属性中设置自定义加network service用户并交互 ...

随机推荐

  1. eclipse配置j2ee项目

    1.下载jdk (1.5,1.6) 安装 从sun的官方网站下载,我下的是jdk-1_5_0_19-nb-6_5_1-windows-ml.exe,集成netbean的版本,下载后一路默认安装. 配置 ...

  2. SPI,UART,I2C都有什么区别,及其各自的特点

    区别: SPI:高速同步串行口.3-4线接口,收发独立.可同步进行 UART:通用异步串行口.按照标准波特率完成双向通讯,速度慢 I2C:一种串行传输方式,三线制,网上可找到其通信协议和用法的 3根线 ...

  3. 《A First Course in Mathematical Modeling》-chaper2-建模过程、比例性及几何相似性

    这一章节着重从整体的层面给出数学建模过程中一个泛式流程,它给出了在给现实模型建立数学模型的框架性思路,但是需要注意的是,虽然这里称其为一种“泛式”思路,但是在具体的问题的分析中,整个建模过程还是充满了 ...

  4. mysql 导出,导入数据

     导出     加-d代表只导出表结构 命令行下具体用法如下:  mysqldump -u用户名 -p密码 -d 數據库名 表名 脚本名; 1.导出数据库为dbname的表结构(其中用户名为root, ...

  5. C++ —— 时间与日期

    导读 在平时编程中有时需要获取当前的时间或者日期,然而不同的平台不同的场景下,有时使用的API也不尽相同.一般来说,C/C++中关于时间的标准库函数在不同的平台的都可以使用,可一些与平台相关的函数就只 ...

  6. 关于我们的Jquery操作下拉列表和复选框,自定义下拉

    后半部分还有自定义下拉列表和开灯关灯的效果,可以进来来看一下 哦 如果网页有下拉列表和复选框,看一下Jquery怎么来操作他们,主要怎么来选取他们的数据,怎么设置某一项选中 先来看个下拉列表 < ...

  7. 如何仿写thinkphp的C方法?

    config.php代码如下: <?php return array( 'db_user'=>'root', 'db_pass'=>'root', 'db_name'=>'te ...

  8. 帮助招聘程序员的自动考试网站:Codility

    Automated tests of programming skills. Assessment of software developers. Recruitment software. Codi ...

  9. webview 本地上传文件

    参考http://blog.csdn.net/zhtsuc/article/details/49154099 直接上代码   public class MainActivity1 extends Ac ...

  10. memcache基本讲解

    Memcached技术 介绍: memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速, 在memachec 中维护 ...