实现C#与Excel文件的交互操作,实现以下功能:

  1、DataTable 导出到 Excel文件

  2、Model数据实体导出到 Excel文件[List<Model>]

  3、导出数据到模版

  4、多DataTable导入到同一Excel文件

    对于第四项功能,常见的用途为:最后一行显示的是百分比,为字符型,而这列其它类型为数据型,如果放在同一个DataTable中,显然不合适。此操作类可实现

  5、将Excel文件导入到数据库表中

    可以指定每个字段的数据类型

  此帮助类的代码量不算少,但注释比较详细,导出数据集中在一个方法,导入数据集中在一个方法。只看完整的两个方法就可以了,其它方法为便于使用所写的辅助简化方法,看看就清楚了:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Configuration;
  5. using Microsoft.Office.Interop.Excel;
  6. using System.Data;
  7. using System.Reflection;
  8. using System.Data.OleDb;
  9.  
  10. namespace SOSP.Common
  11. {
  12. /// <summary>
  13. /// C#与Excel交互类
  14. /// </summary>
  15. public class ExcelHelper
  16. {
  17. #region 导出到Excel
  18. #region ExportExcelForDataTable
  19. /// <summary>
  20. /// 从DataTable导出Excel,指定列别名,指定要排除的列
  21. /// </summary>
  22. /// <param name="dt">DataTable</param>
  23. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  24. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  25. /// <param name="colName">各列的列名List string </param>
  26. /// <param name="excludeColumn">要显示/排除的列</param>
  27. /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
  28. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  29. /// <param name="TemplatePath">模版在项目服务器中路径 例:tp.xlsx 为空字符串时表示无模版</param>
  30. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  31. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  32. /// <returns>bool</returns>
  33. public static bool ToExcelForDataTable(System.Data.DataTable dt, string excelPathName, string pathType, List<string> colName, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  34. {
  35. try
  36. {
  37. if (dt == null || dt.Rows.Count == ) return false;
  38. Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
  39. if (xlApp == null)
  40. {
  41. return false;
  42. }
  43. System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
  44. System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
  45. Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
  46.  
  47. Microsoft.Office.Interop.Excel.Workbook workbook = null;
  48. if (TemplatePath == "")
  49. {
  50. workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
  51. }
  52. else
  53. {
  54. workbook = workbooks.Add(TemplatePath); //加载模板
  55. }
  56. Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[];
  57. Microsoft.Office.Interop.Excel.Range range;
  58.  
  59. long totalCount = dt.Rows.Count;
  60. if (exDataTableList != null && exDataTableList.Count > )
  61. {
  62. foreach (System.Data.DataTable item in exDataTableList)
  63. {
  64. totalCount += item.Rows.Count;
  65. }
  66. }
  67. long rowRead = ;
  68. float percent = ;
  69. string exclStr = "";//要排除的列临时项
  70. object exclType;//DataTable 列的类型,用于做
  71. int colPosition = ;//列位置
  72. if (sheetName != null && sheetName != "")
  73. {
  74. worksheet.Name = sheetName;
  75. }
  76. #region 列别名判定
  77. if (TemplatePath == "")
  78. {
  79. if (colName != null && colName.Count > )
  80. {
  81. #region 指定了列别名
  82. for (int i = ; i < colName.Count; i++)
  83. {
  84. worksheet.Cells[, i + ] = colName[i];
  85. range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ];
  86. range.Interior.ColorIndex = ;
  87. range.Font.Bold = true;
  88. exclType = dt.Columns[i].DataType.Name;
  89. if (exclType.ToString() != "DateTime")
  90. {
  91. //range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
  92. ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.AutoFit();
  93. }
  94. else
  95. {
  96. //规定列宽
  97. ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.ColumnWidth = ;
  98. }
  99. //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
  100. }
  101. #endregion
  102. }
  103. else
  104. {
  105. #region 未指定别名
  106. for (int i = ; i < dt.Columns.Count; i++)
  107. {
  108. worksheet.Cells[, i + ] = dt.Columns[i].ColumnName;
  109. range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ];
  110. range.Interior.ColorIndex = ;
  111. range.Font.Bold = true;
  112. exclType = dt.Columns[i].DataType.Name;
  113. if (exclType.ToString() != "DateTime")
  114. {
  115. //range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
  116. ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.AutoFit();
  117. }
  118. else
  119. {
  120. //规定列宽
  121. ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.ColumnWidth = ;
  122. }
  123. //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
  124. }
  125. #endregion
  126. }
  127. }
  128. else
  129. {
  130. //用了模版,不加载标题
  131. }
  132. #endregion
  133. #region 显示/排除列判定
  134. if (excludeColumn != null && excludeColumn.Count > )
  135. {
  136. switch (excludeType)
  137. {
  138. case "":
  139. {
  140. #region 0为显示所有列
  141. #region 常规项
  142. int r = ;
  143. for (r = ; r < dt.Rows.Count; r++)
  144. {
  145. colPosition = ;
  146. for (int i = ; i < dt.Columns.Count; i++)
  147. {
  148. if (TemplatePath == "")
  149. {
  150. worksheet.Cells[r + , colPosition + ] = dt.Rows[r][i].ToString();
  151. }
  152. else
  153. {
  154. worksheet.Cells[r + TemplateRow, colPosition + ] = dt.Rows[r][i].ToString();
  155. }
  156. colPosition++;
  157. }
  158. rowRead++;
  159. percent = ((float)( * rowRead)) / totalCount;
  160. }
  161. #endregion
  162. #region 扩展项
  163. if (exDataTableList != null && exDataTableList.Count > )
  164. {
  165. foreach (System.Data.DataTable item in exDataTableList)
  166. {
  167. for (int k = ; k < item.Rows.Count; r++, k++)
  168. {
  169. colPosition = ;
  170. //生成扩展 DataTable 每行数据
  171. for (int t = ; t < item.Columns.Count; t++)
  172. {
  173. if (TemplatePath == "")
  174. {
  175. worksheet.Cells[r + , colPosition + ] = item.Rows[k][t].ToString();
  176. }
  177. else
  178. {
  179. worksheet.Cells[r + TemplateRow, colPosition + ] = item.Rows[k][t].ToString();
  180. }
  181. colPosition++;
  182. }
  183. rowRead++;
  184. percent = ((float)( * rowRead)) / totalCount;
  185. }
  186. }
  187. }
  188. #endregion
  189. #endregion
  190. }; break;
  191. case "":
  192. {
  193. #region 1指定的为要显示的列
  194. #region 常规项
  195. int r = ;
  196. for (r = ; r < dt.Rows.Count; r++)
  197. {
  198. colPosition = ;
  199. for (int i = ; i < dt.Columns.Count; i++)
  200. {
  201. exclStr = dt.Columns[i].ColumnName;
  202. if (excludeColumn.Contains(exclStr))
  203. {
  204. if (TemplatePath == "")
  205. {
  206. worksheet.Cells[r + , colPosition + ] = dt.Rows[r][i].ToString();
  207. }
  208. else
  209. {
  210. worksheet.Cells[r + TemplateRow, colPosition + ] = dt.Rows[r][i].ToString();
  211. }
  212. colPosition++;
  213. }
  214. else
  215. {
  216.  
  217. }
  218. }
  219. rowRead++;
  220. percent = ((float)( * rowRead)) / totalCount;
  221. }
  222. #endregion
  223. #region 扩展项
  224. if (exDataTableList != null && exDataTableList.Count > )
  225. {
  226. foreach (System.Data.DataTable item in exDataTableList)
  227. {
  228. for (int k = ; k < item.Rows.Count; r++, k++)
  229. {
  230. colPosition = ;
  231. //生成扩展 DataTable 每行数据
  232. for (int t = ; t < item.Columns.Count; t++)
  233. {
  234. exclStr = dt.Columns[t].ColumnName;
  235. if (excludeColumn.Contains(exclStr))
  236. {
  237. if (TemplatePath == "")
  238. {
  239. worksheet.Cells[r + , colPosition + ] = item.Rows[k][t].ToString();
  240. }
  241. else
  242. {
  243. worksheet.Cells[r + TemplateRow, colPosition + ] = item.Rows[k][t].ToString();
  244. }
  245. colPosition++;
  246. }
  247. else
  248. {
  249.  
  250. }
  251. }
  252. rowRead++;
  253. percent = ((float)( * rowRead)) / totalCount;
  254. }
  255. }
  256. }
  257. #endregion
  258. #endregion
  259. }; break;
  260. case "":
  261. {
  262. #region 2指定的为要排除的列
  263. #region 常规项
  264. int r = ;
  265. for (r = ; r < dt.Rows.Count; r++)
  266. {
  267. colPosition = ;
  268. for (int i = ; i < dt.Columns.Count; i++)
  269. {
  270. exclStr = dt.Columns[i].ColumnName;
  271. if (excludeColumn.Contains(exclStr))
  272. {
  273.  
  274. }
  275. else
  276. {
  277. if (TemplatePath == "")
  278. {
  279. worksheet.Cells[r + , colPosition + ] = dt.Rows[r][i].ToString();
  280. }
  281. else
  282. {
  283. worksheet.Cells[r + TemplateRow, colPosition + ] = dt.Rows[r][i].ToString();
  284. }
  285. colPosition++;
  286. }
  287. }
  288. rowRead++;
  289. percent = ((float)( * rowRead)) / totalCount;
  290. }
  291. #endregion
  292. #region 扩展项
  293. if (exDataTableList != null && exDataTableList.Count > )
  294. {
  295. foreach (System.Data.DataTable item in exDataTableList)
  296. {
  297. for (int k = ; k < item.Rows.Count; r++, k++)
  298. {
  299. colPosition = ;
  300. //生成扩展 DataTable 每行数据
  301. for (int t = ; t < item.Columns.Count; t++)
  302. {
  303. exclStr = dt.Columns[t].ColumnName;
  304. if (excludeColumn.Contains(exclStr))
  305. {
  306.  
  307. }
  308. else
  309. {
  310. if (TemplatePath == "")
  311. {
  312. worksheet.Cells[r + , colPosition + ] = item.Rows[k][t].ToString();
  313. }
  314. else
  315. {
  316. worksheet.Cells[r + TemplateRow, colPosition + ] = item.Rows[k][t].ToString();
  317. }
  318. colPosition++;
  319. }
  320. }
  321. rowRead++;
  322. percent = ((float)( * rowRead)) / totalCount;
  323. }
  324. }
  325. }
  326. #endregion
  327. #endregion
  328. }; break;
  329. default:
  330. break;
  331. }
  332.  
  333. }
  334. else
  335. {
  336. //生成每行数据
  337. int r = ;
  338. for (r = ; r < dt.Rows.Count; r++)
  339. {
  340. //生成每列数据
  341. if (TemplatePath == "")
  342. {
  343. for (int i = ; i < dt.Columns.Count; i++)
  344. {
  345. worksheet.Cells[r + , i + ] = dt.Rows[r][i].ToString();
  346. }
  347. }
  348. else
  349. {
  350. for (int i = ; i < dt.Columns.Count; i++)
  351. {
  352. worksheet.Cells[r + + TemplateRow, i + ] = dt.Rows[r][i].ToString();
  353. }
  354. }
  355. rowRead++;
  356. percent = ((float)( * rowRead)) / totalCount;
  357. }
  358. }
  359. #endregion
  360. switch (pathType)
  361. {
  362. case "": { workbook.Saved = false; }; break;
  363. case "": { workbook.Saved = true; workbook.SaveCopyAs(excelPathName); }; break;
  364. default:
  365. return false;
  366. }
  367. xlApp.Visible = false;//是否在服务器打开
  368. workbook.Close(true, Type.Missing, Type.Missing);
  369. workbook = null;
  370. xlApp.Quit();
  371. xlApp = null;
  372. return true;
  373. }
  374. catch (Exception)
  375. {
  376. return false;
  377. }
  378. }
  379.  
  380. /// <summary>
  381. /// 从DataTable导出Excel,指定列别名
  382. /// </summary>
  383. /// <param name="dt">DataTable</param>
  384. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  385. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  386. /// <param name="colName">各列的列名List string </param>
  387. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  388. /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
  389. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  390. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  391. /// <returns>bool</returns>
  392. public static bool ToExcelForDataTableC(System.Data.DataTable dt, string excelPathName, string pathType, List<string> colName, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  393. {
  394. List<string> excludeColumn = new List<string>();
  395. string excludeType = "";
  396. return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
  397. }
  398.  
  399. /// <summary>
  400. /// 从DataTable导出Excel,指定要排除的列
  401. /// </summary>
  402. /// <param name="dt">DataTable</param>
  403. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  404. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  405. /// <param name="excludeColumn">要显示/排除的列</param>
  406. /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
  407. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  408. /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
  409. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  410. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  411. /// <returns>bool</returns>
  412. public static bool ToExcelForDataTableE(System.Data.DataTable dt, string excelPathName, string pathType, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  413. {
  414. List<string> colName = new List<string>();
  415. return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
  416. }
  417. /// <summary>
  418. /// 从DataTable导出Excel,使用默认列名,不排除导出任何列
  419. /// </summary>
  420. /// <param name="dt">DataTable</param>
  421. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  422. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  423. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  424. /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
  425. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  426. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  427. /// <returns>bool</returns>
  428. public static bool ToExcelForDataTableZ(System.Data.DataTable dt, string excelPathName, string pathType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  429. {
  430. List<string> colName = new List<string>();
  431. List<string> excludeColumn = new List<string>();
  432. string excludeType = "";
  433. return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
  434. }
  435. #endregion
  436.  
  437. #region ExportExcelForModelList
  438. /// <summary>
  439. /// 从DataTable导出Excel,指定列别名,指定要排除的列
  440. /// </summary>
  441. /// <param name="dt">DataTable</param>
  442. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  443. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  444. /// <param name="colName">各列的列名List string </param>
  445. /// <<param name="excludeColumn">要显示/排除的列</param>
  446. /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
  447. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  448. /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
  449. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  450. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  451. /// <returns>bool</returns>
  452. public static bool ToExcelForModelList<T>(List<T> md, string excelPathName, string pathType, List<string> colName, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  453. {
  454. System.Data.DataTable dt = ModelListToDataTable(md);
  455. return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
  456. }
  457.  
  458. /// <summary>
  459. /// 从DataTable导出Excel,指定列别名
  460. /// </summary>
  461. /// <param name="dt">DataTable</param>
  462. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  463. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  464. /// <param name="colName">各列的列名List string </param>
  465. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  466. /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
  467. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  468. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  469. /// <returns>bool</returns>
  470. public static bool ToExcelForModelListC<T>(List<T> md, string excelPathName, string pathType, List<string> colName, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  471. {
  472. List<string> excludeColumn = new List<string>();
  473. string excludeType = "";
  474. return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
  475. }
  476.  
  477. /// <summary>
  478. /// 从DataTable导出Excel,指定要排除的列
  479. /// </summary>
  480. /// <param name="dt">DataTable</param>
  481. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  482. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  483. /// <param name="excludeColumn">要显示/排除的列</param>
  484. /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
  485. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  486. /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
  487. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  488. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  489. /// <returns>bool</returns>
  490. public static bool ToExcelForModelListE<T>(List<T> md, string excelPathName, string pathType, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  491. {
  492. List<string> colName = new List<string>();
  493. return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
  494. }
  495.  
  496. /// <summary>
  497. /// 从DataTable导出Excel,使用默认列名,不排除导出任何列
  498. /// </summary>
  499. /// <param name="dt">DataTable</param>
  500. /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
  501. /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
  502. /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
  503. /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
  504. /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
  505. /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
  506. /// <returns>bool</returns>
  507. public static bool ToExcelForModelListZ<T>(List<T> md, string excelPathName, string pathType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
  508. {
  509. List<string> colName = new List<string>();
  510. List<string> excludeColumn = new List<string>();
  511. string excludeType = "";
  512. return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
  513. }
  514. #endregion
  515.  
  516. #region 从DataTable导出Excel; ToExcelModel实体传参
  517. /// <summary>
  518. /// 从DataTable导出Excel; ToExcelModel实体传参
  519. /// </summary>
  520. /// <param name="tem">ExcelHelper.ToExcelModel</param>
  521. /// <returns></returns>
  522. public static bool ToExcelForDataTable(ToExcelModel tem)
  523. {
  524. if (tem != null)
  525. {
  526. return ToExcelForDataTable(tem.DataTable, tem.excelPathName, tem.pathType, tem.colNameList, tem.excludeColumn, tem.excludeType, tem.sheetName, tem.TemplatePath, tem.TemplateRow, tem.exDataTableList);
  527. }
  528. else
  529. {
  530. return false;
  531. }
  532. }
  533. #endregion
  534.  
  535. #region Model To DataTable
  536. /// <summary>
  537. /// 实体类转换成DataTable
  538. /// </summary>
  539. /// <param name="modelList">实体类列表</param>
  540. /// <returns></returns>
  541. public static System.Data.DataTable ModelListToDataTable<T>(List<T> modelList)
  542. {
  543. System.Data.DataTable dtReturn = new System.Data.DataTable();
  544.  
  545. // column names
  546. PropertyInfo[] oProps = null;
  547.  
  548. if (modelList == null) return dtReturn;
  549.  
  550. foreach (T rec in modelList)
  551. {
  552. if (oProps == null)
  553. {
  554. oProps = ((Type)rec.GetType()).GetProperties();
  555. foreach (PropertyInfo pi in oProps)
  556. {
  557. Type colType = pi.PropertyType;
  558.  
  559. if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
  560. == typeof(Nullable<>)))
  561. {
  562. colType = colType.GetGenericArguments()[];
  563. }
  564.  
  565. dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
  566. }
  567. }
  568.  
  569. DataRow dr = dtReturn.NewRow();
  570.  
  571. foreach (PropertyInfo pi in oProps)
  572. {
  573. dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
  574. (rec, null);
  575. }
  576.  
  577. dtReturn.Rows.Add(dr);
  578. }
  579. return dtReturn;
  580. }
  581. #endregion
  582.  
  583. #region 说明 如何使用
  584. /*
  585. * 功能:
  586. * 1、将System.Data.DataTable数据导出到Excel文件
  587. * 2、将Model(Entity)数据实体导出到Excel文件
  588. * 完整调用:
  589. * 1、ExcelHelper.ToExcelForDataTable(DataTable,excelPathName,pathType,colName,excludeColumn,excludeType,sheetName,TemplatePath,TemplateRow,exDataTableList);
  590. * 2、ExcelHelper.ToExcelForModelList(Model,excelPathName,pathType,colName,excludeColumn,excludeType,sheetName,TemplatePath,TemplateRow,exDataTableList);
  591. * 参数说明:
  592. * 1、DataTable:DataSet.DataTable[0];数据表
  593. * 2、Model:Model.Users users = new Model.Users(){...};数据实体
  594. * 3、excelPathName:含Excel名称的保存路径 在pathType=1时有效。用户自定义保存路径时请赋值空字符串 ""。格式:"E://456.xlsx"
  595. * 4、pathType:路径类型。只能取值:0用户自定义路径,弹出用户选择路径对话框;1服务端定义路径。标识文件保存路径是服务端指定还是客户自定义路径及文件名,与excelPathName参数合用
  596. * 5、colName:各列的列别名List string,比如:字段名为userName,此处可指定为"用户名",并以此显示
  597. * 6、excludeColumn:要显示/排除的列,指定这些列用于显示,或指定这些列用于不显示。倒低这些列是显示还是不显示,由excludeType参数决定
  598. * 7、excludeType:显示/排除列方式。 0为显示所有列 1指定的是要显示的列 2指定的是要排除的列,与excludeColumn合用
  599. * 8、sheetName:sheet1的名称,要使期保持默认名称请指定为空字符串 ""
  600. * 9、TemplatePath:模版在项目服务器中路径 例:tp.xlsx 。当为空字符串 "" 时表示无模版
  601. * 10、TemplateRow:模版中已存在数据的行数,与TemplatePath合用,无模版时请传入参数 0
  602. * 11、exDataTableList:扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同
  603. * 注意:
  604. * 1、exDataTableList参数为一个List<System.Data.DataTable> 集合,当数据为 Model 时,可先调用 ExcelHelper.ModelListToDataTable(System.Data.DataTable dt)将Model转为System.Data.DataTable
  605. */
  606. #endregion
  607. #endregion
  608. #region 从Excel导入数据到 Ms Sql
  609. /// <summary>
  610. /// 从Excel导入数据到 Ms Sql
  611. /// </summary>
  612. /// <param name="excelFile">Excel文件路径(含文件名)</param>
  613. /// <param name="sheetName">sheet名</param>
  614. /// <param name="DbTableName">存储到数据库中的数据库表名称</param>
  615. /// <param name="columnType">对应表格的数据类型,如果为null,则为默认类型:double,nvarchar(500),datetime</param>
  616. /// <param name="connectionString">连接字符串</param>
  617. /// <returns></returns>
  618. public static bool FromExcel(string excelFile, string sheetName, string DbTableName, List<string> columnType, string connectionString)
  619. {
  620. DataSet ds = new DataSet();
  621. try
  622. {
  623. //获取全部数据
  624. //string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
  625. string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + excelFile + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; //此连
  626. #region 知识扩展
  627. //HDR=Yes,代表第一行是标题,不做为数据使用。HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
  628. //IMEX=0 只读模式
  629. //IMEX=1 写入模式
  630. //IMEX=2 可读写模式
  631. #endregion
  632. #region 命名执行
  633. using (OleDbConnection conn = new OleDbConnection(strConn))
  634. {
  635. conn.Open();
  636. string strExcel = "";
  637. OleDbDataAdapter myCommand = null;
  638. strExcel = string.Format("select * from [{0}$]", sheetName);
  639. myCommand = new OleDbDataAdapter(strExcel, strConn);
  640. myCommand.Fill(ds, sheetName);
  641.  
  642. #region 数据库表是否存在的 T-SQL 检测语句准备
  643. //如果目标表不存在则创建
  644. string strSql = string.Format("if object_id('{0}') is null create table {0}(", DbTableName != "" ? DbTableName : sheetName);
  645. if (columnType != null && columnType.Count > )
  646. {
  647. #region 手动指定定每个字段的数据类型
  648. //指定数据格式,要求一一对应
  649. for (int i = ; i < ds.Tables[].Columns.Count; i++)
  650. {
  651. System.Data.DataColumn c = ds.Tables[].Columns[i];
  652. strSql += string.Format("[{0}] {1},", c.ColumnName, columnType[i]);
  653. }
  654. #endregion
  655. }
  656. else
  657. {
  658. #region 使用默认数据类型
  659. foreach (System.Data.DataColumn c in ds.Tables[].Columns)
  660. {
  661. //使用默认格式:只有double,DateTime,String三种类型
  662. switch (c.DataType.ToString())
  663. {
  664. case "DateTime":
  665. {
  666. strSql += string.Format("[{0}] DateTime,", c.ColumnName);
  667. }; break;
  668. case "Double":
  669. {
  670. strSql += string.Format("[{0}] double,", c.ColumnName);
  671. }; break;
  672. default:
  673. strSql += string.Format("[{0}] nvarchar(500),", c.ColumnName);
  674. break;
  675. }
  676. }
  677. #endregion
  678. }
  679. strSql = strSql.Trim(',') + ")";
  680. #endregion
  681. #region 执行 T-SQL 如果数据库表不存在则新建表,如果存在则不新建
  682. using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
  683. {
  684. sqlconn.Open();
  685. System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
  686. command.CommandText = strSql;
  687. command.ExecuteNonQuery();
  688. sqlconn.Close();
  689. }
  690. #endregion
  691. #region 向数据库表插入数据
  692. using (System.Data.SqlClient.SqlBulkCopy sbc = new System.Data.SqlClient.SqlBulkCopy(connectionString))
  693. {
  694. sbc.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
  695. sbc.BatchSize = ;//每次传输的行数
  696. sbc.NotifyAfter = ;//进度提示的行数
  697. sbc.DestinationTableName = DbTableName != "" ? DbTableName : sheetName;//数据库表名表名
  698. sbc.WriteToServer(ds.Tables[]);
  699. }
  700. #endregion
  701. }
  702. #endregion
  703. }
  704. catch (Exception ex)
  705. {
  706. return false;
  707. }
  708. return true;
  709. }
  710. #region 进度显示
  711. /// <summary>
  712. /// 进度显示
  713. /// </summary>
  714. /// <param name="sender"></param>
  715. /// <param name="e"></param>
  716. static void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
  717. {
  718. e.RowsCopied.ToString();
  719. }
  720. #endregion
  721. #endregion
  722. }
  723. public class ToExcelModel
  724. {
  725. #region ToExcelModel自动属性
  726. /// <summary>
  727. /// 数据表
  728. /// </summary>
  729. public System.Data.DataTable DataTable { get; set; }
  730. /// <summary>
  731. /// 含Excel名称的保存路径 在pathType=1时有效。用户自定义保存路径时请赋值空字符串 ""。格式:"E://456.xlsx"
  732. /// </summary>
  733. public string excelPathName { get; set; }
  734. /// <summary>
  735. /// 路径类型。只能取值:0用户自定义路径,弹出用户选择路径对话框;1服务端定义路径。标识文件保存路径是服务端指定还是客户自定义路径及文件名,与excelPathName参数合用
  736. /// </summary>
  737. public string pathType { get; set; }
  738. /// <summary>
  739. /// 各列的列别名List string,比如:字段名为userName,此处可指定为"用户名",并以此显示
  740. /// </summary>
  741. public List<string> colNameList { get; set; }
  742. /// <summary>
  743. /// 要显示/排除的列,指定这些列用于显示,或指定这些列用于不显示。倒低这些列是显示还是不显示,由excludeType参数决定
  744. /// </summary>
  745. public List<string> excludeColumn { get; set; }
  746. /// <summary>
  747. /// 显示/排除列方式。 0为显示所有列 1指定的是要显示的列 2指定的是要排除的列,与excludeColumn合用
  748. /// </summary>
  749. public string excludeType { get; set; }
  750. /// <summary>
  751. /// sheet1的名称,要使期保持默认名称请指定为空字符串 ""
  752. /// </summary>
  753. public string sheetName { get; set; }
  754. /// <summary>
  755. /// 模版在项目服务器中路径 例:tp.xlsx 。当为空字符串 "" 时表示无模版
  756. /// </summary>
  757. public string TemplatePath { get; set; }
  758. /// <summary>
  759. /// 模版中已存在数据的行数,与TemplatePath合用,无模版时请传入参数 0
  760. /// </summary>
  761. public int TemplateRow { get; set; }
  762. /// <summary>
  763. /// 扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同
  764. /// </summary>
  765. public List<System.Data.DataTable> exDataTableList { get; set; }
  766. #endregion
  767. }
  768. public class FromExcelModel
  769. {
  770. /// <summary>
  771. /// Excel文件路径(含文件名)
  772. /// </summary>
  773. public string excelFile { get; set; }
  774. /// <summary>
  775. /// sheet名<
  776. /// </summary>
  777. public string sheetName { get; set; }
  778. /// <summary>
  779. /// 存储到数据库中的数据库表名称
  780. /// </summary>
  781. public string DbTableName { get; set; }
  782. /// <summary>
  783. /// 对应表格的数据类型,如果为null,则为默认类型:double,nvarchar(500),datetime
  784. /// </summary>
  785. public List<string> columnTypeList { get; set; }
  786. /// <summary>
  787. /// 连接字符串 server=serverip;database=databasename;uid=username;pwd=password;
  788. /// </summary>
  789. public string connectionString { get; set; }
  790. }
  791. }

调用示例:

        /// <summary>
/// 导出至Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
try
{
BLL.COMMON_UserInfo cu = new BLL.COMMON_UserInfo();
List<Model.COMMON_UserInfo> cuiList = cu.GetModelList("");
BLL.manager_log bll = new BLL.manager_log();
DataSet ds = bll.GetList(, "", "id");
System.Data.DataTable dt = ds.Tables[];
List<string> colName = new List<string>() {
"用户ID",
"用户名",
"备注",
"用户IP",
"操作时间",
"操作时间1",
"操作时间2"
};
List<string> tt = new List<string>() { "action_type" };
DataSet dss = bll.GetList(, "", "id");
List<System.Data.DataTable> dtss = new List<System.Data.DataTable>();
dtss.Add(dss.Tables[]);
dtss.Add(dss.Tables[]);
dtss.Add(dss.Tables[]);
ExcelHelper.ToExcelForDataTable(dt, Server.MapPath("~").ToString() + "456.xlsx", "", colName, tt, "", "", "", , dtss);//指定了列别名,指定了要排除的列
ToExcelModel tem = new ToExcelModel()
{
DataTable = dt,
excelPathName = "",
pathType = "",
colNameList = colName,
excludeColumn = tt,
excludeType = "",
sheetName = "成功",
TemplatePath = "",
TemplateRow = ,
exDataTableList = dtss
};
ExcelHelper.ToExcelForDataTable(tem);
}
catch (Exception ex)
{
FileLog.Log(ex.Message, "ExportExcelByDataTable");
}
}
        /// <summary>
/// 导入数据到数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
string excelFile = "G://123.xls";
string sheetName = "Sheet1";
string DbTableName = "test_new_table";// "test_new_table";
List<string> columnType = new List<string>() {
"int",
"nvarchar(100)",
"decimal(18,2)",
"nvarchar(100)",
"datetime"
};
string connectionString = "server=.;database=Test1;uid=sa;pwd=zhangquan;";
ExcelHelper.FromExcel(excelFile, sheetName, DbTableName, columnType, connectionString);
}

C# Excel操作类 ExcelHelper的更多相关文章

  1. [.Net] C# Excel操作类 ExcelHelper

    实现C#与Excel文件的交互操作,实现以下功能: 1.DataTable 导出到 Excel文件 2.Model数据实体导出到 Excel文件[List<Model>] 3.导出数据到模 ...

  2. C#EXCEL 操作类--C#ExcelHelper操作类

    主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...

  3. Excel 操作类

    转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...

  4. C#常用工具类——Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  5. C# Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  6. C#常用工具类——Excel操作类(ZT)

    本文转载于: http://www.cnblogs.com/zfanlong1314/p/3916047.html /// 常用工具类——Excel操作类 /// <para> ----- ...

  7. C#封装的VSTO Excel操作类

    自己在用的Excel操作类,因为经常在工作中要操作Excel文件,可是使用vba实现起来实在是不方便,而且编写也很困难,拼接一个字符串都看的眼花. 这个时候C#出现了,发现使用C#来操作Excel非常 ...

  8. C#自定义Excel操作类

    C#自定义Excel操作类,可以用于将DataTable导出到Excel文件,从Excel文件读取数据. using System; using System.IO; using System.Dat ...

  9. 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)

    一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...

随机推荐

  1. tar 压缩解压

     tar命令 tar可以为文件和目录创建档案.利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件, 或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现在,用户可 ...

  2. 基于多层感知机的手写数字识别(Tensorflow实现)

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...

  3. C#语法之特性

    在项目中经常可以看到在类属性上面有一个[]的东西,今天讲的东西就是它,它英文名是Attribute,中文名是特性. 一.什么是特性? 首先,我们肯定Attribute是一个类,下面是msdn文档对它的 ...

  4. HTTP 无法注册URL 进程不具有命名空间的访问权限

    写WCF时在 host.Open(); 报错:HTTP 无法注册 URL http://+:9999/CalculatorService/.进程不具有此命名空间的访问权限(有关详细信息,请参见 htt ...

  5. windows7 资源管理器无法显示常用

    1.windows7 资源管理器无法显示常用 2.windows7 资源管理器无法附加的解决办法. 删除以下文件夹内的所有文件即可%APPDATA%\Microsoft\Windows\Recent\ ...

  6. WebFrom 【内置对象】— —跳转页面,页面传值

      Response    --  响应请求对象 传值  Response.Redirect("url");     --  地址?变量= 值  Response      -- ...

  7. (译文)The Linux Programming Interface:第1章(历史和标准)

    1 HISTORY AND STANDARDS (译者:鱼时代  校对:fgn) Linux 是UNIX操作系统家族中的一员,在计算机出现以来,UNXI已经有很长的历史了.在这一章中的第一部分将对Un ...

  8. java的锁机制——synchronized

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...

  9. 在mysql中RIGHT JOIN与group by一起使用引起的一个大bug

    本来按理说这个小问题不值得写一个博客的,不过正是这个小问题造成了一个大bug. 本来每月对数据都好好的,但是这一两天突然发现许多数据明显不对,这一块的代码和sql有些不是我写的,不过出现了bug,还是 ...

  10. VM虚拟机克隆_修改网络

    1.如果网络中没有VMware的网卡,记得重置即可 2.如果右上角没有了网络图标,直接 server NetworkManager restart 3.网络配置 1)在/etc/sysconfig/n ...