1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Odbc;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Windows;
  9. using System.Windows.Input;
  10. using Excel = Microsoft.Office.Interop.Excel;
  11.  
  12. namespace ExcelExportImport
  13. {
  14. public class ExcelHelper
  15. {
  16. private Excel.Application _excelApp = null;
  17. private Excel.Workbooks _books = null;
  18. private Excel._Workbook _book = null;
  19. private Excel.Sheets _sheets = null;
  20. private Excel._Worksheet _sheet = null;
  21. private Excel.Range _range = null;
  22. private Excel.Font _font = null;
  23. // Optional argument variable
  24. private object _optionalValue = Missing.Value;
  25.  
  26. /// <summary>
  27. /// 读取Excel文件
  28. /// </summary>
  29. /// <param name="pPath"></param>
  30. /// <returns></returns>
  31. public DataTable LoadExcel(string pPath)
  32. {
  33. //Driver={Driver do Microsoft Excel(*.xls)} 这种连接写法不需要创建一个数据源DSN,DRIVERID表示驱动ID,Excel2003后都使用790,FIL表示Excel文件类型,Excel2007用excel 8.0,MaxBufferSize表示缓存大小,DBQ表示读取Excel的文件名(全路径)
  34.  
  35. string connString = "Driver={Driver do Microsoft Excel(*.xls)};DriverId=790;SafeTransactions=0;ReadOnly=1;MaxScanRows=16;Threads=3;MaxBufferSize=2024;UserCommitSync=Yes;FIL=excel 8.0;PageTimeout=5;";
  36. connString += "DBQ=" + pPath;
  37. OdbcConnection conn = new OdbcConnection(connString);
  38. OdbcCommand cmd = new OdbcCommand();
  39. cmd.Connection = conn;
  40. //获取Excel中第一个Sheet名称,作为查询时的表名
  41. string sheetName = this.GetExcelSheetName(pPath);
  42. string sql = "select * from [" + sheetName.Replace('.', '#') + "$]";
  43. cmd.CommandText = sql;
  44. OdbcDataAdapter da = new OdbcDataAdapter(cmd);
  45. DataSet ds = new DataSet();
  46. try
  47. {
  48. da.Fill(ds);
  49. return ds.Tables[0];
  50. }
  51. catch (Exception x)
  52. {
  53. ds = null;
  54.  
  55. throw new Exception("从Excel文件中获取数据时发生错误!");
  56. }
  57. finally
  58. {
  59. cmd.Dispose();
  60. cmd = null;
  61. da.Dispose();
  62. da = null;
  63. if (conn.State == ConnectionState.Open)
  64. {
  65. conn.Close();
  66. }
  67. conn = null;
  68. }
  69. }
  70. private string GetExcelSheetName(string pPath)
  71. {
  72. //打开一个Excel应用
  73.  
  74. _excelApp = new Excel.Application();
  75. if (_excelApp == null)
  76. {
  77. throw new Exception("打开Excel应用时发生错误!");
  78. }
  79. _books = _excelApp.Workbooks;
  80. //打开一个现有的工作薄
  81. _book = _books.Add(pPath);
  82. _sheets = _book.Sheets;
  83. //选择第一个Sheet页
  84. _sheet = (Excel._Worksheet)_sheets.get_Item(1);
  85. string sheetName = _sheet.Name;
  86.  
  87. ReleaseCOM(_sheet);
  88. ReleaseCOM(_sheets);
  89. ReleaseCOM(_book);
  90. ReleaseCOM(_books);
  91. _excelApp.Quit();
  92. ReleaseCOM(_excelApp);
  93. return sheetName;
  94. }
  95. /// <summary>
  96. /// 释放COM对象
  97. /// </summary>
  98. /// <param name="pObj"></param>
  99. private void ReleaseCOM(object pObj)
  100. {
  101. try
  102. {
  103. System.Runtime.InteropServices.Marshal.ReleaseComObject(pObj);
  104. }
  105. catch
  106. {
  107. throw new Exception("释放资源时发生错误!");
  108. }
  109. finally
  110. {
  111. pObj = null;
  112. }
  113. }
  114. ///以下为导出实现功能
  115. /// <summary>
  116. /// 保存到Excel
  117. /// </summary>
  118. /// <param name="excelName"></param>
  119. public void SaveToExcel(string excelName,DataTable dataTable)
  120. {
  121. try
  122. {
  123. if (dataTable != null)
  124. {
  125. if (dataTable.Rows.Count != 0)
  126. {
  127. Mouse.SetCursor(Cursors.Wait);
  128. CreateExcelRef();
  129. FillSheet(dataTable);
  130. SaveExcel(excelName);
  131. Mouse.SetCursor(Cursors.Arrow);
  132. }
  133. }
  134. }
  135. catch (Exception e)
  136. {
  137. MessageBox.Show("Error while generating Excel report");
  138. }
  139. finally
  140. {
  141. ReleaseCOM(_sheet);
  142. ReleaseCOM(_sheets);
  143. ReleaseCOM(_book);
  144. ReleaseCOM(_books);
  145. ReleaseCOM(_excelApp);
  146. }
  147. }
  148.  
  149. /// <summary>
  150. /// 将内存中Excel保存到本地路径
  151. /// </summary>
  152. /// <param name="excelName"></param>
  153. private void SaveExcel(string excelName)
  154. {
  155. _excelApp.Visible = false;
  156. //保存为Office2003和Office2007都兼容的格式
  157. _book.SaveAs(excelName, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel8, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
  158. _excelApp.Quit();
  159.  
  160. }
  161.  
  162. /// <summary>
  163. /// 将数据填充到内存Excel的工作表
  164. /// </summary>
  165. /// <param name="dataTable"></param>
  166. private void FillSheet(DataTable dataTable)
  167. {
  168. object[] header = CreateHeader(dataTable);
  169. WriteData(header,dataTable);
  170. }
  171.  
  172. private void WriteData(object[] header,DataTable dataTable)
  173. {
  174. object[,] objData = new object[dataTable.Rows.Count, header.Length];
  175.  
  176. for (int j = 0; j < dataTable.Rows.Count; j++)
  177. {
  178. var item = dataTable.Rows[j];
  179. for (int i = 0; i < header.Length; i++)
  180. {
  181. var y = dataTable.Rows[j][i];
  182. objData[j, i] = (y == null) ? "" : y.ToString();
  183. }
  184. }
  185. AddExcelRows("A2", dataTable.Rows.Count, header.Length, objData);
  186. AutoFitColumns("A1", dataTable.Rows.Count + 1, header.Length);
  187. }
  188.  
  189. private void AutoFitColumns(string startRange, int rowCount, int colCount)
  190. {
  191. _range = _sheet.get_Range(startRange, _optionalValue);
  192. _range = _range.get_Resize(rowCount, colCount);
  193. _range.Columns.AutoFit();
  194. }
  195.  
  196. private object[] CreateHeader(DataTable dataTable)
  197. {
  198.  
  199. List<object> objHeaders = new List<object>();
  200. for (int n = 0; n < dataTable.Columns.Count; n++)
  201. {
  202. objHeaders.Add(dataTable.Columns[n].ColumnName);
  203. }
  204.  
  205. var headerToAdd = objHeaders.ToArray();
  206. //工作表的单元是从“A1”开始
  207. AddExcelRows("A6", 1, headerToAdd.Length, headerToAdd);
  208. SetHeaderStyle();
  209.  
  210. return headerToAdd;
  211. }
  212.  
  213. /// <summary>
  214. /// 将表头加粗显示
  215. /// </summary>
  216. private void SetHeaderStyle()
  217. {
  218. _font = _range.Font;
  219. _font.Bold = true;
  220. }
  221.  
  222. /// <summary>
  223. /// 将数据填充到Excel工作表的单元格中
  224. /// </summary>
  225. /// <param name="startRange"></param>
  226. /// <param name="rowCount"></param>
  227. /// <param name="colCount"></param>
  228. /// <param name="values"></param>
  229. private void AddExcelRows(string startRange, int rowCount, int colCount, object values)
  230. {
  231. _range = _sheet.get_Range(startRange, _optionalValue);
  232. _range = _range.get_Resize(rowCount, colCount);
  233. _range.set_Value(_optionalValue, values);
  234. }
  235. /// <summary>
  236. /// 创建一个Excel程序实例
  237. /// </summary>
  238. private void CreateExcelRef()
  239. {
  240. _excelApp = new Excel.Application();
  241. _books = (Excel.Workbooks)_excelApp.Workbooks;
  242. _book = (Excel._Workbook)(_books.Add(_optionalValue));
  243. _sheets = (Excel.Sheets)_book.Worksheets;
  244. _sheet = (Excel._Worksheet)(_sheets.get_Item(1));
  245. }
  246. }
  247. }

  

ExcelHelper Excel,Export,Import的更多相关文章

  1. 【从翻译mos文章】不再用par file如果是,export or import 包含大写和小写表名称表

    不再用par file如果是,export or import 包含大写和小写表名称表 参考原始: How to Export or Import Case Sensitive Tables With ...

  2. es6环境中,export与import使用方法

    前言 参考自阮一峰大神的教程:http://es6.ruanyifeng.com/?search=export&x=6&y=5#docs/module#export-命令 声明:如有问 ...

  3. export,export default和import的区别以及用法

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和import export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口 ...

  4. export ,export default 和 import 区别 以及用法

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

  5. export,import ,export default区别

    export,import ,export default区别 一.export,import ,export default ES6模块主要有两个功能:export和import export用于对 ...

  6. export,import ,export default 彻底弄痛

    ES6模块主要有两个功能:export和import 说白了就是一个淡出一个导入,就相当于以前的公共js样,哪个页面要用,就script 引入这个js  ,然后  无耻的调用这个js中的方法了. ex ...

  7. export,import ,export default是什么

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

  8. [ES6]import 与export的用法 ,export 与export default 的 区别 以及用法

    一.import 与export export(导出):用于对外输出本模块(一个文件可以理解为一个模块)变量的接口: import(导入):用于在一个模块中加载另一个含有export接口的模块. 1. ...

  9. export,import ,export default的区别

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

随机推荐

  1. 【Demo 0016】SQLite 数据库

    本章学习要点:       1.  熟悉SQL语句:       2.  掌握SQLit库的基本用法;        3.  掌握SQLite封装:

  2. 带着项目学PHP第九讲 - 如何给ecshop的wap版本首页和商品页添加商品图片

    ecshop的wap版本自身不带图片, 所以看起来光秃秃的,非常不讨人喜欢, 网络上关于wap的模板就不像pc版那么多,容易找到, 而且能找到的都是要花钱买的, 虽然这个小小的改动不能替代找个合适的模 ...

  3. 在WIN7系统的笔记本上建立WIFI热点

        成功与否的关键在于你是否依照顺序运行:       前置条件:右键"我的电脑"--"属性"--"设备管理器"--"网络适配 ...

  4. [Cocos2d-x]CCSpriteBatchNode的使用

    文档: http://cocos2d.cocoachina.com/document/index/class?url=dd/d95/classcocos2d_1_1_c_c_sprite_batch_ ...

  5. MySQL多表查询之外键、表连接、子查询、索引

    MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...

  6. poj 1991 Turning in Homework dp

    这个可以证明必须从两边的任务开始交起,因为中间交的任务可以后面经过的时候再交,所以就变成了一个n*n的dp. #include <iostream> #include <cstdio ...

  7. Java面向对象基础二

    1.对象的用法 2.多对象的创建方法 3.匿名对象的创建和用法

  8. JMX操作ActiveMQ(1)

    我们知道ActiveMQ broker的管理接口是通过JMX方式提供的. 一个简单的访问方式就是通过jconsole,输入 service:jmx:rmi:///jndi/rmi://localhos ...

  9. httpclient超时总结(转)

    Httpclient超时 背景: 网站这边多次因为httpclient调用超时时间没设置好导致关掉,影响非常不好,而且问题重复出现,查看网络,没有比较明确介绍httpclient所有超时相关的设置(大 ...

  10. Storm构建分布式实时处理应用初探(转)

    最近利用闲暇时间,又重新研读了一下Storm.认真对比了一下Hadoop,前者更擅长的是,实时流式数据处理,后者更擅长的是基于HDFS,通过MapReduce方式的离线数据分析计算.对于Hadoop, ...