ExcelManage.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. using System;
  2. using System.IO;
  3. using System.Data;
  4. using System.Data.OleDb;
  5. using System.Collections;
  6. namespace Ant.Service.Utilities
  7. {
  8. /// <summary>
  9. /// ExcelManage 的摘要说明。
  10. /// </summary>
  11. public class ExcelManage
  12. {
  13. public ExcelManage()
  14. {
  15. }
  16. /// <summary>
  17. /// 获取Excel数据表列表
  18. /// </summary>
  19. /// <param name="ExcelFileName"></param>
  20. /// <returns></returns>
  21. public static ArrayList GetExcelTables(string ExcelFileName)
  22. {
  23. //将Excel架构存入数据里
  24. DataTable dt = new DataTable();
  25. ArrayList TablesList = new ArrayList();
  26. if (File.Exists(ExcelFileName))
  27. {
  28. using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))
  29. {
  30. try
  31. {
  32. conn.Open();
  33. dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
  34. }
  35. catch (Exception exp)
  36. {
  37. throw exp;
  38. }
  39. //获取数据表个数
  40. int tablecount = dt.Rows.Count;
  41. for (int i = 0; i < tablecount; i++)
  42. {
  43. string tablename = dt.Rows[i][2].ToString().Trim().TrimEnd('$');
  44. if (TablesList.IndexOf(tablename) < 0)
  45. {
  46. TablesList.Add(tablename);
  47. }
  48. }
  49. }
  50. }
  51. return TablesList;
  52. }
  53. /// <summary>
  54. /// 获取指定Excel文件数据表的数据列列表
  55. /// </summary>
  56. /// <param name="ExcelFileName">Excel文件名</param>
  57. /// <param name="TableName">数据表名</param>
  58. /// <returns></returns>
  59. public static ArrayList GetExcelTableColumns(string ExcelFileName, string TableName)
  60. {
  61. //将Excel架构存入数据里
  62. DataTable dt = new DataTable();
  63. ArrayList ColsList = new ArrayList();
  64. if (File.Exists(ExcelFileName))
  65. {
  66. using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))
  67. {
  68. conn.Open();
  69. dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, TableName, null });
  70. //获取列个数
  71. int colcount = dt.Rows.Count;
  72. for (int i = 0; i < colcount; i++)
  73. {
  74. string colname = dt.Rows[i]["Column_Name"].ToString().Trim();
  75. ColsList.Add(colname);
  76. }
  77. }
  78. }
  79. return ColsList;
  80. }
  81. /// <summary>
  82. /// 将数据导出至Excel
  83. /// </summary>
  84. /// <param name="Table">DataTable对象</param>
  85. /// <param name="ExcelFilePath">Excel文件路径</param>
  86. /// <returns></returns>
  87. public static bool OutputToExcel(DataTable Table, string ExcelFilePath)
  88. {
  89. if (File.Exists(ExcelFilePath))
  90. {
  91. throw new Exception("该文件已经存在!");
  92. }
  93. if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))
  94. {
  95. Table.TableName = "Sheet1";
  96. }
  97. //数据表的列数
  98. int ColCount = Table.Columns.Count;
  99. //用于记数,实例化参数时的序号
  100. int i = 0;
  101. //创建参数
  102. OleDbParameter[] para = new OleDbParameter[ColCount];
  103. //创建表结构的SQL语句
  104. string TableStructStr = @"Create Table " + Table.TableName + "(";
  105. //连接字符串
  106. string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
  107. OleDbConnection objConn = new OleDbConnection(connString);
  108. //创建表结构
  109. OleDbCommand objCmd = new OleDbCommand();
  110. //数据类型集合
  111. ArrayList DataTypeList = new ArrayList();
  112. DataTypeList.Add("System.Decimal");
  113. DataTypeList.Add("System.Double");
  114. DataTypeList.Add("System.Int16");
  115. DataTypeList.Add("System.Int32");
  116. DataTypeList.Add("System.Int64");
  117. DataTypeList.Add("System.Single");
  118. //遍历数据表的所有列,用于创建表结构
  119. foreach (DataColumn col in Table.Columns)
  120. {
  121. //如果列属于数字列,则设置该列的数据类型为double
  122. if (DataTypeList.IndexOf(col.DataType.ToString()) >= 0)
  123. {
  124. para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.Double);
  125. objCmd.Parameters.Add(para[i]);
  126. //如果是最后一列
  127. if (i + 1 == ColCount)
  128. {
  129. TableStructStr += col.ColumnName + " double)";
  130. }
  131. else
  132. {
  133. TableStructStr += col.ColumnName + " double,";
  134. }
  135. }
  136. else
  137. {
  138. para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.VarChar);
  139. objCmd.Parameters.Add(para[i]);
  140. //如果是最后一列
  141. if (i + 1 == ColCount)
  142. {
  143. TableStructStr += col.ColumnName + " varchar)";
  144. }
  145. else
  146. {
  147. TableStructStr += col.ColumnName + " varchar,";
  148. }
  149. }
  150. i++;
  151. }
  152. //创建Excel文件及文件结构
  153. try
  154. {
  155. objCmd.Connection = objConn;
  156. objCmd.CommandText = TableStructStr;
  157. if (objConn.State == ConnectionState.Closed)
  158. {
  159. objConn.Open();
  160. }
  161. objCmd.ExecuteNonQuery();
  162. }
  163. catch (Exception exp)
  164. {
  165. throw exp;
  166. }
  167. //插入记录的SQL语句
  168. string InsertSql_1 = "Insert into " + Table.TableName + " (";
  169. string InsertSql_2 = " Values (";
  170. string InsertSql = "";
  171. //遍历所有列,用于插入记录,在此创建插入记录的SQL语句
  172. for (int colID = 0; colID < ColCount; colID++)
  173. {
  174. if (colID + 1 == ColCount) //最后一列
  175. {
  176. InsertSql_1 += Table.Columns[colID].ColumnName + ")";
  177. InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ")";
  178. }
  179. else
  180. {
  181. InsertSql_1 += Table.Columns[colID].ColumnName + ",";
  182. InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ",";
  183. }
  184. }
  185. InsertSql = InsertSql_1 + InsertSql_2;
  186. //遍历数据表的所有数据行
  187. for (int rowID = 0; rowID < Table.Rows.Count; rowID++)
  188. {
  189. for (int colID = 0; colID < ColCount; colID++)
  190. {
  191. if (para[colID].DbType == DbType.Double && Table.Rows[rowID][colID].ToString().Trim() == "")
  192. {
  193. para[colID].Value = 0;
  194. }
  195. else
  196. {
  197. para[colID].Value = Table.Rows[rowID][colID].ToString().Trim();
  198. }
  199. }
  200. try
  201. {
  202. objCmd.CommandText = InsertSql;
  203. objCmd.ExecuteNonQuery();
  204. }
  205. catch (Exception exp)
  206. {
  207. string str = exp.Message;
  208. }
  209. }
  210. try
  211. {
  212. if (objConn.State == ConnectionState.Open)
  213. {
  214. objConn.Close();
  215. }
  216. }
  217. catch (Exception exp)
  218. {
  219. throw exp;
  220. }
  221. return true;
  222. }
  223. /// <summary>
  224. /// 将数据导出至Excel
  225. /// </summary>
  226. /// <param name="Table">DataTable对象</param>
  227. /// <param name="Columns">要导出的数据列集合</param>
  228. /// <param name="ExcelFilePath">Excel文件路径</param>
  229. /// <returns></returns>
  230. public static bool OutputToExcel(DataTable Table, ArrayList Columns, string ExcelFilePath)
  231. {
  232. if (File.Exists(ExcelFilePath))
  233. {
  234. throw new Exception("该文件已经存在!");
  235. }
  236. //如果数据列数大于表的列数,取数据表的所有列
  237. if (Columns.Count > Table.Columns.Count)
  238. {
  239. for (int s = Table.Columns.Count + 1; s <= Columns.Count; s++)
  240. {
  241. Columns.RemoveAt(s); //移除数据表列数后的所有列
  242. }
  243. }
  244. //遍历所有的数据列,如果有数据列的数据类型不是 DataColumn,则将它移除
  245. DataColumn column = new DataColumn();
  246. for (int j = 0; j < Columns.Count; j++)
  247. {
  248. try
  249. {
  250. column = (DataColumn)Columns[j];
  251. }
  252. catch (Exception)
  253. {
  254. Columns.RemoveAt(j);
  255. }
  256. }
  257. if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))
  258. {
  259. Table.TableName = "Sheet1";
  260. }
  261. //数据表的列数
  262. int ColCount = Columns.Count;
  263. //用于记数,实例化参数时的序号
  264. //int i = 0;
  265. //创建参数
  266. OleDbParameter[] para = new OleDbParameter[ColCount];
  267. //创建表结构的SQL语句
  268. string TableStructStr = @"Create Table " + Table.TableName + "(";
  269. //连接字符串
  270. string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
  271. OleDbConnection objConn = new OleDbConnection(connString);
  272. //创建表结构
  273. OleDbCommand objCmd = new OleDbCommand();
  274. //数据类型集合
  275. ArrayList DataTypeList = new ArrayList();
  276. DataTypeList.Add("System.Decimal");
  277. DataTypeList.Add("System.Double");
  278. DataTypeList.Add("System.Int16");
  279. DataTypeList.Add("System.Int32");
  280. DataTypeList.Add("System.Int64");
  281. DataTypeList.Add("System.Single");
  282. DataColumn col = new DataColumn();
  283. //遍历数据表的所有列,用于创建表结构
  284. for (int k = 0; k < ColCount; k++)
  285. {
  286. col = (DataColumn)Columns[k];
  287. //列的数据类型是数字型
  288. if (DataTypeList.IndexOf(col.DataType.ToString().Trim()) >= 0)
  289. {
  290. para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.Double);
  291. objCmd.Parameters.Add(para[k]);
  292. //如果是最后一列
  293. if (k + 1 == ColCount)
  294. {
  295. TableStructStr += col.Caption.Trim() + " Double)";
  296. }
  297. else
  298. {
  299. TableStructStr += col.Caption.Trim() + " Double,";
  300. }
  301. }
  302. else
  303. {
  304. para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.VarChar);
  305. objCmd.Parameters.Add(para[k]);
  306. //如果是最后一列
  307. if (k + 1 == ColCount)
  308. {
  309. TableStructStr += col.Caption.Trim() + " VarChar)";
  310. }
  311. else
  312. {
  313. TableStructStr += col.Caption.Trim() + " VarChar,";
  314. }
  315. }
  316. }
  317. //创建Excel文件及文件结构
  318. try
  319. {
  320. objCmd.Connection = objConn;
  321. objCmd.CommandText = TableStructStr;
  322. if (objConn.State == ConnectionState.Closed)
  323. {
  324. objConn.Open();
  325. }
  326. objCmd.ExecuteNonQuery();
  327. }
  328. catch (Exception exp)
  329. {
  330. throw exp;
  331. }
  332. //插入记录的SQL语句
  333. string InsertSql_1 = "Insert into " + Table.TableName + " (";
  334. string InsertSql_2 = " Values (";
  335. string InsertSql = "";
  336. //遍历所有列,用于插入记录,在此创建插入记录的SQL语句
  337. for (int colID = 0; colID < ColCount; colID++)
  338. {
  339. if (colID + 1 == ColCount) //最后一列
  340. {
  341. InsertSql_1 += Columns[colID].ToString().Trim() + ")";
  342. InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ")";
  343. }
  344. else
  345. {
  346. InsertSql_1 += Columns[colID].ToString().Trim() + ",";
  347. InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ",";
  348. }
  349. }
  350. InsertSql = InsertSql_1 + InsertSql_2;
  351. //遍历数据表的所有数据行
  352. DataColumn DataCol = new DataColumn();
  353. for (int rowID = 0; rowID < Table.Rows.Count; rowID++)
  354. {
  355. for (int colID = 0; colID < ColCount; colID++)
  356. {
  357. //因为列不连续,所以在取得单元格时不能用行列编号,列需得用列的名称
  358. DataCol = (DataColumn)Columns[colID];
  359. if (para[colID].DbType == DbType.Double && Table.Rows[rowID][DataCol.Caption].ToString().Trim() == "")
  360. {
  361. para[colID].Value = 0;
  362. }
  363. else
  364. {
  365. para[colID].Value = Table.Rows[rowID][DataCol.Caption].ToString().Trim();
  366. }
  367. }
  368. try
  369. {
  370. objCmd.CommandText = InsertSql;
  371. objCmd.ExecuteNonQuery();
  372. }
  373. catch (Exception exp)
  374. {
  375. string str = exp.Message;
  376. }
  377. }
  378. try
  379. {
  380. if (objConn.State == ConnectionState.Open)
  381. {
  382. objConn.Close();
  383. }
  384. }
  385. catch (Exception exp)
  386. {
  387. throw exp;
  388. }
  389. return true;
  390. }
  391. /// <summary>
  392. /// 导入Excel数据表至DataTable(第一行作为表头)
  393. /// </summary>
  394. /// <param name="ExcelFilePath">Excel文件路径</param>
  395. /// <param name="TableName">数据表名,如果数据表名错误,默认为第一个数据表名</param>
  396. /// <returns></returns>
  397. public static DataTable InputFromExcel(string ExcelFilePath, string TableName)
  398. {
  399. if (!File.Exists(ExcelFilePath))
  400. {
  401. throw new Exception("Excel文件不存在!");
  402. }
  403. //如果数据表名不存在,数据表名为Excel文件的第一个数据表
  404. ArrayList TableList = new ArrayList();
  405. TableList = ExcelManage.GetExcelTables(ExcelFilePath);
  406. if (TableName.IndexOf(TableName) < 0)
  407. {
  408. TableName = TableList[0].ToString().Trim();
  409. }
  410. DataTable table = new DataTable();
  411. OleDbConnection dbcon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0");
  412. OleDbCommand cmd = new OleDbCommand("select * from [" + TableName + "$]", dbcon);
  413. OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
  414. try
  415. {
  416. if (dbcon.State == ConnectionState.Closed)
  417. {
  418. dbcon.Open();
  419. }
  420. adapter.Fill(table);
  421. }
  422. catch (Exception exp)
  423. {
  424. throw exp;
  425. }
  426. finally
  427. {
  428. if (dbcon.State == ConnectionState.Open)
  429. {
  430. dbcon.Close();
  431. }
  432. }
  433. return table;
  434. }
  435. }
  436. }