ExcelEdit.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace OTSMeasureApp
  7. {
  8. /// <SUMMARY>
  9. /// C#操作Excel类,更新日期2018-8-28,补充部份操作功能,后续功能在使用需要再进行完善
  10. /// </SUMMARY>
  11. public class ExcelEdit
  12. {
  13. #region 变量定义
  14. /// <summary>
  15. /// excel的文件名
  16. /// </summary>
  17. public string m_Filename;
  18. public Microsoft.Office.Interop.Excel.Application m_app;
  19. public Microsoft.Office.Interop.Excel.Workbooks m_wbs;
  20. public Microsoft.Office.Interop.Excel.Workbook m_wb;
  21. public Microsoft.Office.Interop.Excel.Worksheets m_wss;
  22. public Microsoft.Office.Interop.Excel.Worksheet m_ws;
  23. /// <summary>
  24. /// 使用的Excel版本号
  25. /// </summary>
  26. public int m_FormatNum = -4143;
  27. #endregion
  28. #region 构造函数
  29. /// <summary>
  30. /// 构造函数
  31. /// </summary>
  32. public ExcelEdit()
  33. {
  34. //
  35. // TODO: 在此处添加构造函数逻辑
  36. //
  37. }
  38. #endregion
  39. #region 文件操作
  40. /// <summary>
  41. /// 创建一个Microsoft.Office.Interop.Excel对象
  42. /// </summary>
  43. public void Create()
  44. {
  45. m_app = new Microsoft.Office.Interop.Excel.Application();
  46. m_wbs = m_app.Workbooks;
  47. if (Convert.ToDouble(m_app.Version) < 12)
  48. {
  49. m_FormatNum = -4143;
  50. }
  51. else
  52. {
  53. m_FormatNum = 56;
  54. }
  55. m_wb = m_wbs.Add(true);
  56. }
  57. /// <summary>
  58. /// 打开一个Microsoft.Office.Interop.Excel文件
  59. /// </summary>
  60. /// <param name="FileName"></param>
  61. public void Open(string FileName)
  62. {
  63. m_app = new Microsoft.Office.Interop.Excel.Application();
  64. m_wbs = m_app.Workbooks;
  65. m_wb = m_wbs.Add(FileName);
  66. //wb = wbs.Open(FileName, 0, true, 5,"", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true,Type.Missing,Type.Missing);
  67. //wb = wbs.Open(FileName,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);
  68. m_Filename = FileName;
  69. }
  70. /// <summary>
  71. /// 保存文档
  72. /// </summary>
  73. /// <returns></returns>
  74. public bool Save()
  75. {
  76. if (m_Filename == "")
  77. {
  78. return false;
  79. }
  80. else
  81. {
  82. try
  83. {
  84. m_wb.Save();
  85. return true;
  86. }
  87. catch (Exception ex)
  88. {
  89. string str = ex.ToString();
  90. return false;
  91. }
  92. }
  93. }
  94. /// <summary>
  95. /// 文档另存为
  96. /// </summary>
  97. /// <param name="FileName"></param>
  98. /// <returns></returns>
  99. public bool SaveAs(object FileName)
  100. {
  101. try
  102. {
  103. m_wb.SaveAs(FileName, m_FormatNum, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
  104. return true;
  105. }
  106. catch (Exception ex)
  107. {
  108. string str = ex.ToString();
  109. return false;
  110. }
  111. }
  112. /// <summary>
  113. /// 文档保存为PDF格式
  114. /// </summary>
  115. /// <param name="FileName"></param>
  116. /// <returns></returns>
  117. public bool SaveAsPDF(string FileName)
  118. {
  119. try
  120. {
  121. //转PDF部份,好用是好用,但是格式不好控制
  122. m_ws.PageSetup.Zoom = false;//只有该项为false时,下面的才有效
  123. m_ws.PageSetup.FitToPagesWide = 1;
  124. m_ws.PageSetup.FitToPagesTall = false;
  125. m_ws.PageSetup.Orientation = Microsoft.Office.Interop.Excel.XlPageOrientation.xlLandscape;
  126. m_ws.PageSetup.PaperSize = Microsoft.Office.Interop.Excel.XlPaperSize.xlPaperA4;
  127. m_wb.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF,
  128. FileName + ".pdf",
  129. Microsoft.Office.Interop.Excel.XlFixedFormatQuality.xlQualityStandard,
  130. Type.Missing,
  131. false,
  132. Type.Missing,
  133. Type.Missing,
  134. false,
  135. Type.Missing);
  136. return true;
  137. }
  138. catch (Exception ex)
  139. {
  140. string str = ex.ToString();
  141. return false;
  142. }
  143. }
  144. /// <summary>
  145. /// 关闭一个Microsoft.Office.Interop.Excel对象,销毁对象
  146. /// </summary>
  147. public void Close()
  148. {
  149. m_wb.Close(Type.Missing, Type.Missing, Type.Missing);
  150. m_wbs.Close();
  151. m_app.Quit();
  152. m_wb = null;
  153. m_wbs = null;
  154. m_app = null;
  155. GC.Collect();
  156. }
  157. #endregion
  158. #region 工作表相关
  159. /// <summary>
  160. /// 获取一个工作表
  161. /// </summary>
  162. /// <param name="SheetName"></param>
  163. /// <returns></returns>
  164. public Microsoft.Office.Interop.Excel.Worksheet GetSheet(string SheetName)
  165. {
  166. Microsoft.Office.Interop.Excel.Worksheet s = (Microsoft.Office.Interop.Excel.Worksheet)m_wb.Worksheets[SheetName];
  167. return s;
  168. }
  169. /// <summary>
  170. /// 添加一个工作表
  171. /// </summary>
  172. /// <param name="SheetName"></param>
  173. /// <returns></returns>
  174. public Microsoft.Office.Interop.Excel.Worksheet AddSheet(string SheetName)
  175. {
  176. Microsoft.Office.Interop.Excel.Worksheet s = (Microsoft.Office.Interop.Excel.Worksheet)m_wb.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
  177. s.Name = SheetName;
  178. return s;
  179. }
  180. /// <summary>
  181. /// 删除一个工作表
  182. /// </summary>
  183. /// <param name="SheetName"></param>
  184. public void DelSheet(string SheetName)
  185. {
  186. ((Microsoft.Office.Interop.Excel.Worksheet)m_wb.Worksheets[SheetName]).Delete();
  187. }
  188. /// <summary>
  189. /// 重命名一个工作表
  190. /// </summary>
  191. /// <param name="OldSheetName"></param>
  192. /// <param name="NewSheetName"></param>
  193. /// <returns></returns>
  194. public Microsoft.Office.Interop.Excel.Worksheet ReNameSheet(string OldSheetName, string NewSheetName)
  195. {
  196. Microsoft.Office.Interop.Excel.Worksheet s = (Microsoft.Office.Interop.Excel.Worksheet)m_wb.Worksheets[OldSheetName];
  197. s.Name = NewSheetName;
  198. return s;
  199. }
  200. /// <summary>
  201. /// 重命名一个工作表
  202. /// </summary>
  203. /// <param name="Sheet"></param>
  204. /// <param name="NewSheetName"></param>
  205. /// <returns></returns>
  206. public Microsoft.Office.Interop.Excel.Worksheet ReNameSheet(Microsoft.Office.Interop.Excel.Worksheet Sheet, string NewSheetName)
  207. {
  208. Sheet.Name = NewSheetName;
  209. return Sheet;
  210. }
  211. #endregion
  212. #region 单元格相关
  213. /// <summary>
  214. /// 向单元格中设置值,ws:要设值的工作表 X行Y列 value 值
  215. /// </summary>
  216. /// <param name="ws"></param>
  217. /// <param name="x"></param>
  218. /// <param name="y"></param>
  219. /// <param name="value"></param>
  220. public void SetCellValue(Microsoft.Office.Interop.Excel.Worksheet ws, int x, int y, object value)
  221. {
  222. ws.Cells[x, y] = value;
  223. }
  224. /// <summary>
  225. /// ws:要设值的工作表的名称 X行Y列 value 值
  226. /// </summary>
  227. /// <param name="ws"></param>
  228. /// <param name="x"></param>
  229. /// <param name="y"></param>
  230. /// <param name="value"></param>
  231. public void SetCellValue(string ws, int x, int y, object value)
  232. {
  233. GetSheet(ws).Cells[x, y] = value;
  234. }
  235. /// <summary>
  236. /// 设置一个单元格的属性 字体, 大小,颜色 ,对齐方式
  237. /// </summary>
  238. /// <param name="ws"></param>
  239. /// <param name="Startx"></param>
  240. /// <param name="Starty"></param>
  241. /// <param name="Endx"></param>
  242. /// <param name="Endy"></param>
  243. /// <param name="size"></param>
  244. /// <param name="name"></param>
  245. /// <param name="color"></param>
  246. /// <param name="HorizontalAlignment"></param>
  247. public void SetCellProperty(Microsoft.Office.Interop.Excel.Worksheet ws, int Startx, int Starty, int Endx, int Endy, int size, string name, Microsoft.Office.Interop.Excel.Constants color, Microsoft.Office.Interop.Excel.Constants HorizontalAlignment)
  248. {
  249. name = "宋体";
  250. size = 12;
  251. color = Microsoft.Office.Interop.Excel.Constants.xlAutomatic;
  252. HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlRight;
  253. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Name = name;
  254. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Size = size;
  255. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Color = color;
  256. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).HorizontalAlignment = HorizontalAlignment;
  257. }
  258. /// <summary>
  259. /// 设置单元格的属性
  260. /// </summary>
  261. /// <param name="wsn"></param>
  262. /// <param name="Startx"></param>
  263. /// <param name="Starty"></param>
  264. /// <param name="Endx"></param>
  265. /// <param name="Endy"></param>
  266. /// <param name="size"></param>
  267. /// <param name="name"></param>
  268. /// <param name="color"></param>
  269. /// <param name="HorizontalAlignment"></param>
  270. public void SetCellProperty(string wsn, int Startx, int Starty, int Endx, int Endy, int size, string name, Microsoft.Office.Interop.Excel.Constants color, Microsoft.Office.Interop.Excel.Constants HorizontalAlignment)
  271. {
  272. Microsoft.Office.Interop.Excel.Worksheet ws = GetSheet(wsn);
  273. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Name = name;
  274. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Size = size;
  275. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Color = color;
  276. ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).HorizontalAlignment = HorizontalAlignment;
  277. }
  278. /// <summary>
  279. /// 合并单元格
  280. /// </summary>
  281. /// <param name="ws"></param>
  282. /// <param name="x1"></param>
  283. /// <param name="y1"></param>
  284. /// <param name="x2"></param>
  285. /// <param name="y2"></param>
  286. public void UniteCells(Microsoft.Office.Interop.Excel.Worksheet ws, int x1, int y1, int x2, int y2)
  287. {
  288. ws.get_Range(ws.Cells[x1, y1], ws.Cells[x2, y2]).Merge(Type.Missing);
  289. }
  290. /// <summary>
  291. /// 合并单元格
  292. /// </summary>
  293. /// <param name="ws"></param>
  294. /// <param name="x1"></param>
  295. /// <param name="y1"></param>
  296. /// <param name="x2"></param>
  297. /// <param name="y2"></param>
  298. public void UniteCells(string ws, int x1, int y1, int x2, int y2)
  299. {
  300. GetSheet(ws).get_Range(GetSheet(ws).Cells[x1, y1], GetSheet(ws).Cells[x2, y2]).Merge(Type.Missing);
  301. }
  302. #endregion
  303. #region 内存中操作相关
  304. /// <summary>
  305. /// 将内存中数据表格插入到Microsoft.Office.Interop.Excel指定工作表的指定位置 为在使用模板时控制格式时使用一
  306. /// </summary>
  307. /// <param name="dt"></param>
  308. /// <param name="ws"></param>
  309. /// <param name="startX"></param>
  310. /// <param name="startY"></param>
  311. public void InsertTable(System.Data.DataTable dt, string ws, int startX, int startY)
  312. {
  313. for (int i = 0; i <= dt.Rows.Count - 1; i++)
  314. {
  315. for (int j = 0; j <= dt.Columns.Count - 1; j++)
  316. {
  317. GetSheet(ws).Cells[startX + i, j + startY] = dt.Rows[i][j].ToString();
  318. }
  319. }
  320. }
  321. /// <summary>
  322. /// 将内存中数据表格插入到Microsoft.Office.Interop.Excel指定工作表的指定位置二
  323. /// </summary>
  324. /// <param name="dt"></param>
  325. /// <param name="ws"></param>
  326. /// <param name="startX"></param>
  327. /// <param name="startY"></param>
  328. public void InsertTable(System.Data.DataTable dt, Microsoft.Office.Interop.Excel.Worksheet ws, int startX, int startY)
  329. {
  330. for (int i = 0; i <= dt.Rows.Count - 1; i++)
  331. {
  332. for (int j = 0; j <= dt.Columns.Count - 1; j++)
  333. {
  334. ws.Cells[startX + i, j + startY] = dt.Rows[i][j];
  335. }
  336. }
  337. }
  338. /// <summary>
  339. /// 将内存中数据表格添加到Microsoft.Office.Interop.Excel指定工作表的指定位置一
  340. /// </summary>
  341. /// <param name="dt"></param>
  342. /// <param name="ws"></param>
  343. /// <param name="startX"></param>
  344. /// <param name="startY"></param>
  345. public void AddTable(System.Data.DataTable dt, string ws, int startX, int startY)
  346. {
  347. for (int i = 0; i <= dt.Rows.Count - 1; i++)
  348. {
  349. for (int j = 0; j <= dt.Columns.Count - 1; j++)
  350. {
  351. GetSheet(ws).Cells[i + startX, j + startY] = dt.Rows[i][j];
  352. }
  353. }
  354. }
  355. /// <summary>
  356. /// 将内存中数据表格添加到Microsoft.Office.Interop.Excel指定工作表的指定位置二
  357. /// </summary>
  358. /// <param name="dt"></param>
  359. /// <param name="ws"></param>
  360. /// <param name="startX"></param>
  361. /// <param name="startY"></param>
  362. public void AddTable(System.Data.DataTable dt, Microsoft.Office.Interop.Excel.Worksheet ws, int startX, int startY)
  363. {
  364. for (int i = 0; i <= dt.Rows.Count - 1; i++)
  365. {
  366. for (int j = 0; j <= dt.Columns.Count - 1; j++)
  367. {
  368. ws.Cells[i + startX, j + startY] = dt.Rows[i][j];
  369. }
  370. }
  371. }
  372. #endregion
  373. #region 图片操作相关
  374. /// <summary>
  375. /// 插入图片操作
  376. /// </summary>
  377. /// <param name="Filename"></param>
  378. /// <param name="ws"></param>
  379. public void InsertPictures(string Filename, string ws)
  380. {
  381. GetSheet(ws).Shapes.AddPicture(Filename, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, 10, 10, 30, 30);
  382. }
  383. /// <summary>
  384. /// 插入图片操作,重载
  385. /// </summary>
  386. /// <param name="Filename"></param>
  387. /// <param name="ws"></param>
  388. /// <param name="left"></param>
  389. /// <param name="top"></param>
  390. /// <param name="width"></param>
  391. /// <param name="height"></param>
  392. public void Insertpictures(string Filename, string ws, float left, float top, float width, float height)
  393. {
  394. GetSheet(ws).Shapes.AddPicture(Filename, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, left, top, width, height);
  395. }
  396. /// <summary>
  397. /// 插入图表操作
  398. /// </summary>
  399. /// <param name="ChartType"></param>
  400. /// <param name="ws"></param>
  401. /// <param name="DataSourcesX1"></param>
  402. /// <param name="DataSourcesY1"></param>
  403. /// <param name="DataSourcesX2"></param>
  404. /// <param name="DataSourcesY2"></param>
  405. /// <param name="ChartDataType"></param>
  406. public void InsertActiveChart(Microsoft.Office.Interop.Excel.XlChartType ChartType, string ws, int DataSourcesX1, int DataSourcesY1, int DataSourcesX2, int DataSourcesY2, Microsoft.Office.Interop.Excel.XlRowCol ChartDataType)
  407. {
  408. ChartDataType = Microsoft.Office.Interop.Excel.XlRowCol.xlColumns;
  409. m_wb.Charts.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
  410. {
  411. m_wb.ActiveChart.ChartType = ChartType;
  412. m_wb.ActiveChart.SetSourceData(GetSheet(ws).get_Range(GetSheet(ws).Cells[DataSourcesX1, DataSourcesY1], GetSheet(ws).Cells[DataSourcesX2, DataSourcesY2]), ChartDataType);
  413. m_wb.ActiveChart.Location(Microsoft.Office.Interop.Excel.XlChartLocation.xlLocationAsObject, ws);
  414. }
  415. }
  416. #endregion
  417. #region 颜色定义
  418. /// <summary>
  419. /// 常用颜色定义,对就Excel中颜色名,暂保留用来记录,查阅使用
  420. /// </summary>
  421. public enum ColorIndex
  422. {
  423. 无色 = -4142, 自动 = -4105, 黑色 = 1, 褐色 = 53, 橄榄 = 52, 深绿 = 51, 深青 = 49,
  424. 深蓝 = 11, 靛蓝 = 55, 灰色80 = 56, 深红 = 9, 橙色 = 46, 深黄 = 12, 绿色 = 10,
  425. 青色 = 14, 蓝色 = 5, 蓝灰 = 47, 灰色50 = 16, 红色 = 3, 浅橙色 = 45, 酸橙色 = 43,
  426. 海绿 = 50, 水绿色 = 42, 浅蓝 = 41, 紫罗兰 = 13, 灰色40 = 48, 粉红 = 7,
  427. 金色 = 44, 黄色 = 6, 鲜绿 = 4, 青绿 = 8, 天蓝 = 33, 梅红 = 54, 灰色25 = 15,
  428. 玫瑰红 = 38, 茶色 = 40, 浅黄 = 36, 浅绿 = 35, 浅青绿 = 34, 淡蓝 = 37, 淡紫 = 39,
  429. 白色 = 2
  430. }
  431. #endregion
  432. }
  433. }