.net framework导出Excel、Word、Pdf和Html:Magicodes.IE的简单使用

这里介绍一个很方便实用的库:Magicodes.IE,导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel、Word、Pdf和Html。

本篇介绍基本使用方法,使用方法非常简单,不需要学习npoi的应用。

在vs中,新建一个控制台项目(测试用,可以建其他项目,比如asp.net mvc ,winform都可以)

右键单击项目中的引用,选择nuget包管理,导入nuget包:这里只使用excel,所以只导入了Magicodes.IE.Excel

  1. Magicodes.IE.Core

  2. Magicodes.IE.Excel

  3. Magicodes.IE.Pdf

  4. Magicodes.IE.Word

  5. Magicodes.IE.Html



1. 首先准备好一个类,这个类包含需要导出的属性一、导出数据

  1. public class Question

  2. {

  3. public string Title { get; set; }

  4. public string Content { get; set; }

  5. public string Options { get; set; }

  6. public string Answer { get; set; }

  7. }

2.导出方法

这里如果new List<Question>()不设置数据,就可以直接导出Question的模板

  1. static void ExportQuestion()

  2. {

  3. //这里需要补充,如果路径不存在要创建路径,否则会报错

  4. var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "question.xlsx");

  5. var exporter = new ExcelExporter();

  6. var result = exporter.Export(filePath, new List<Question>() {

  7. new Question()

  8. {

  9. Title = "Question1",

  10. Content = "Question content 1",

  11. Options = "A:option1,B:option2,C:option3,D:option4",

  12. Answer = "A",

  13. },

  14. new Question()

  15. {

  16. Title = "Question2",

  17. Content = "Question content 2",

  18. Options = "A:option11,B:option22,C:option33,D:option43",

  19. Answer = "B",

  20. }

  21. });

  22. }

其他方法参考下代码吧:

  1. using Magicodes.ExporterAndImporter.Core;

  2. using Magicodes.ExporterAndImporter.Excel;

  3. using Magicodes.ExporterAndImporter.Excel.Builder;

  4. using System;

  5. using System.Collections.Generic;

  6. using System.ComponentModel.DataAnnotations;

  7. using System.IO;

  8. using System.Text;

  9. using System.Threading.Tasks;

  10. namespace Test

  11. {

  12. class Program

  13. {

  14. //static void Main(string[] args)

  15. static async Task Main(string[] args)

  16. {

  17. await Import3();

  18. Console.WriteLine("Hello World!");

  19. }

  20. #region 导出excel demo

  21. /// <summary>

  22. /// 导出excel测试:excel1

  23. /// </summary>

  24. static void Demo1()

  25. {

  26. //这里需要补充,如果路径不存在要创建路径,否则会报错

  27. var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "demo1.xlsx");

  28. var exporter = new ExcelExporter();

  29. var result = exporter.Export(filePath, new List<ExportTestData>() {

  30. new ExportTestData()

  31. {

  32. Name1 = "1",

  33. Name2 = "test",

  34. Name3 = "12",

  35. Name4 = "11",

  36. },

  37. new ExportTestData()

  38. {

  39. Name1 = "1",

  40. Name2 = "test",

  41. Name3 = "12",

  42. Name4 = "11",

  43. }

  44. });

  45. }

  46. static void ExportQuestion()

  47. {

  48. //这里需要补充,如果路径不存在要创建路径,否则会报错

  49. var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "question.xlsx");

  50. var exporter = new ExcelExporter();

  51. var result = exporter.Export(filePath, new List<Question>() {

  52. new Question()

  53. {

  54. Title = "Question1",

  55. Content = "Question content 1",

  56. Options = "A:option1,B:option2,C:option3,D:option4",

  57. Answer = "A",

  58. },

  59. new Question()

  60. {

  61. Title = "Question2",

  62. Content = "Question content 2",

  63. Options = "A:option11,B:option22,C:option33,D:option43",

  64. Answer = "B",

  65. }

  66. });

  67. }

  68. /// <summary>

  69. /// 导出空模板测试:excel11

  70. /// </summary>

  71. static void Demo11()

  72. {

  73. //这里需要补充,如果路径不存在要创建路径,否则会报错

  74. var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ImportProduct2Dto.xlsx");

  75. var exporter = new ExcelExporter();

  76. var result = exporter.Export(filePath, new List<ImportProduct2Dto>());

  77. }

  78. /// <summary>

  79. /// 利用特性导出excel2

  80. /// </summary>

  81. static void Demo2()

  82. {

  83. var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "demo2.xlsx");

  84. ExcelExporter exporter = new ExcelExporter();

  85. var result = exporter.Export(filePath, new List<ExportTestDataWithAttrs>()

  86. {

  87. new ExportTestDataWithAttrs()

  88. {

  89. Text1 = "啊实打实大苏打撒",

  90. Name="aa",

  91. Number =5000,

  92. Text2 = "w萨达萨达萨达撒",

  93. Text3 = "sadsad打发打发士大夫的"

  94. },

  95. new ExportTestDataWithAttrs()

  96. {

  97. Text1 = "啊实打实大苏打撒",

  98. Name="啊实打实大苏打撒",

  99. Number =6000,

  100. Text2 = "w萨达萨达萨达撒",

  101. Text3 = "sadsad打发打发士大夫的"

  102. },

  103. new ExportTestDataWithAttrs()

  104. {

  105. Text1 = "啊实打实速度大苏打撒",

  106. Name="萨达萨达",

  107. Number =6000,

  108. Text2 = "突然他也让他人",

  109. Text3 = "sadsad打发打发士大夫的"

  110. },

  111. });

  112. }

  113. /// <summary>

  114. /// 列头处理或者多语言支持测试

  115. /// </summary>

  116. static void Demo3()

  117. {

  118. var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles","testAttrsLocalization.xlsx");

  119. if (File.Exists(filePath)) File.Delete(filePath);

  120. var exporter = new ExcelExporter();

  121. ExcelBuilder.Create().WithColumnHeaderStringFunc((key) =>

  122. {

  123. if (key.Contains("文本"))

  124. {

  125. return "Text";

  126. }

  127. return "未知语言";

  128. }).Build();

  129. var result = exporter.Export(filePath, new List<AttrsLocalizationTestData>()

  130. {

  131. new AttrsLocalizationTestData()

  132. {

  133. Text = "啊实打实大苏打撒",

  134. Name="aa",

  135. Number =5000,

  136. Text2 = "w萨达萨达萨达撒",

  137. Text3 = "sadsad打发打发士大夫的"

  138. },

  139. new AttrsLocalizationTestData()

  140. {

  141. Text = "啊实打实大苏打撒",

  142. Name="啊实打实大苏打撒",

  143. Number =6000,

  144. Text2 = "w萨达萨达萨达撒",

  145. Text3 = "sadsad打发打发士大夫的"

  146. },

  147. new AttrsLocalizationTestData()

  148. {

  149. Text = "啊实打实速度大苏打撒",

  150. Name="萨达萨达",

  151. Number =6000,

  152. Text2 = "突然他也让他人",

  153. Text3 = "sadsad打发打发士大夫的"

  154. },

  155. });

  156. }

  157. #endregion

  158. /// <summary>

  159. /// 从excel导入数据测试1

  160. /// </summary>

  161. /// <returns></returns>

  162. private static async Task Import1()

  163. {

  164. var importer = new ExcelImporter();

  165. var importResult = await importer.Import<ImportProductDto>(Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "importer1.xlsx"));

  166. foreach (var item in importResult.Data)

  167. {

  168. Console.WriteLine(item.Name+"-"+item.Code+"-"+item.BarCode);

  169. }

  170. }

  171. /// <summary>

  172. /// 导入带有枚举值的数据

  173. /// </summary>

  174. /// <returns></returns>

  175. private static async Task Import2()

  176. {

  177. var importer = new ExcelImporter();

  178. var importResult = await importer.Import<ImportProduct2Dto>(Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ImportProduct2Dto.xlsx"));

  179. foreach (var item in importResult.Data)

  180. {

  181. Console.WriteLine(item.Name + "-" + item.Code + "-" + item.BarCode+"-"+item.Type.ToString());

  182. }

  183. }

  184. /// <summary>

  185. /// 导入数据验证

  186. /// </summary>

  187. /// <returns></returns>

  188. private static async Task Import3()

  189. {

  190. var importer = new ExcelImporter();

  191. var importResult = await importer.Import<ImportProduct3Dto>(Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ImportProduct2Dto.xlsx"));

  192. if (importResult.HasError)

  193. {

  194. StringBuilder stringBuilder = new StringBuilder();

  195. foreach (var item in importResult.RowErrors)

  196. {

  197. stringBuilder.AppendLine("出错行数:" + item.RowIndex);

  198. foreach (var fielderror in item.FieldErrors)

  199. {

  200. stringBuilder.AppendLine("\t出错列:" + fielderror.Key+"\n\t出错原因:"+fielderror.Value);

  201. }

  202. }

  203. Console.WriteLine(stringBuilder.ToString());

  204. }

  205. else

  206. {

  207. foreach (var item in importResult.Data)

  208. {

  209. Console.WriteLine(item.Name + "-" + item.Code + "-" + item.BarCode + "-" + item.Type.ToString());

  210. }

  211. }

  212. }

  213. }

  214. #region 导出excel demo class

  215. public class ExportTestData

  216. {

  217. public string Name1 { get; set; }

  218. public string Name2 { get; set; }

  219. public string Name3 { get; set; }

  220. public string Name4 { get; set; }

  221. }

  222. public class Question

  223. {

  224. public string Title { get; set; }

  225. public string Content { get; set; }

  226. public string Options { get; set; }

  227. public string Answer { get; set; }

  228. }

  229. /// <summary>

  230. /// 特性导出Excel

  231. /// </summary>

  232. [ExcelExporter(Name ="测试",TableStyle ="Light10")]

  233. public class ExportTestDataWithAttrs

  234. {

  235. [ExporterHeader(DisplayName="加粗文本",IsBold=true)]

  236. public string Text1 { get; set; }

  237. [ExporterHeader(DisplayName ="普通文本")]

  238. public string Text2 { get; set; }

  239. [ExporterHeader(DisplayName = "忽略", IsIgnore = true)]

  240. public string Text3 { get; set; }

  241. [ExporterHeader(DisplayName = "数值", Format = "#,##0")]

  242. public double Number { get; set; }

  243. [ExporterHeader(DisplayName = "名称", IsAutoFit = true)]

  244. public string Name { get; set; }

  245. }

  246. /// <summary>

  247. /// 列头处理或者多语言支持

  248. /// </summary>

  249. [ExcelExporter(Name = "测试", TableStyle = "Light10")]

  250. public class AttrsLocalizationTestData

  251. {

  252. [ExporterHeader(DisplayName = "加粗文本", IsBold = true)]

  253. public string Text { get; set; }

  254. [ExporterHeader(DisplayName = "普通文本")]

  255. public string Text2 { get; set; }

  256. [ExporterHeader(DisplayName = "忽略", IsIgnore = true)]

  257. public string Text3 { get; set; }

  258. [ExporterHeader(DisplayName = "数值", Format = "#,##0")]

  259. public double Number { get; set; }

  260. [ExporterHeader(DisplayName = "名称", IsAutoFit = true)]

  261. public string Name { get; set; }

  262. }

  263. #endregion

  264. /// <summary>

  265. /// 从excel导入数据 dto

  266. /// </summary>

  267. public class ImportProductDto

  268. {

  269. /// <summary>

  270. /// 产品名称

  271. /// </summary>

  272. [ImporterHeader(Name = "产品名称")]

  273. public string Name { get; set; }

  274. /// <summary>

  275. /// 产品代码

  276. /// </summary>

  277. [ImporterHeader(Name = "产品代码")]

  278. public string Code { get; set; }

  279. /// <summary>

  280. /// 产品条码

  281. /// </summary>

  282. [ImporterHeader(Name = "产品条码")]

  283. public string BarCode { get; set; }

  284. }

  285. [ExcelExporter(Name = "测试1", TableStyle = "Light10")]

  286. public class ImportProduct2Dto

  287. {

  288. /// <summary>

  289. /// 产品名称

  290. /// </summary>

  291. [ImporterHeader(Name = "产品名称")]

  292. [ExporterHeader(DisplayName = "产品名称")]

  293. public string Name { get; set; }

  294. /// <summary>

  295. /// 产品代码

  296. /// </summary>

  297. [ImporterHeader(Name = "产品代码")]

  298. [ExporterHeader(DisplayName = "产品代码")]

  299. public string Code { get; set; }

  300. /// <summary>

  301. /// 产品条码

  302. /// </summary>

  303. [ImporterHeader(Name = "产品条码")]

  304. [ExporterHeader(DisplayName = "产品条码")]

  305. public string BarCode { get; set; }

  306. /// <summary>

  307. /// 客户Id

  308. /// </summary>

  309. [ImporterHeader(Name = "客户代码")]

  310. [ExporterHeader(DisplayName = "客户代码")]

  311. public long ClientId { get; set; }

  312. /// <summary>

  313. /// 产品型号

  314. /// </summary>

  315. [ImporterHeader(Name = "产品型号")]

  316. [ExporterHeader(DisplayName = "产品型号")]

  317. public string Model { get; set; }

  318. /// <summary>

  319. /// 申报价值

  320. /// </summary>

  321. [ImporterHeader(Name = "申报价值")]

  322. [ExporterHeader(DisplayName = "申报价值")]

  323. public double DeclareValue { get; set; }

  324. /// <summary>

  325. /// 货币单位

  326. /// </summary>

  327. [ImporterHeader(Name = "货币单位")]

  328. [ExporterHeader(DisplayName = "货币单位")]

  329. public string CurrencyUnit { get; set; }

  330. /// <summary>

  331. /// 品牌名称

  332. /// </summary>

  333. [ImporterHeader(Name = "品牌名称")]

  334. [ExporterHeader(DisplayName = "品牌名称")]

  335. public string BrandName { get; set; }

  336. /// <summary>

  337. /// 尺寸

  338. /// </summary>

  339. [ImporterHeader(Name = "尺寸(长x宽x高)")]

  340. [ExporterHeader(DisplayName = "尺寸(长x宽x高)")]

  341. public string Size { get; set; }

  342. /// <summary>

  343. /// 重量

  344. /// </summary>

  345. [ImporterHeader(Name = "重量(KG)")]

  346. [ExporterHeader(DisplayName = "重量(KG)")]

  347. public double Weight { get; set; }

  348. /// <summary>

  349. /// 类型

  350. /// </summary>

  351. [ImporterHeader(Name = "类型")]

  352. [ExporterHeader(DisplayName = "类型")]

  353. public ImporterProductType Type { get; set; }

  354. /// <summary>

  355. /// 是否行

  356. /// </summary>

  357. [ImporterHeader(Name = "是否行")]

  358. [ExporterHeader(DisplayName = "是否行")]

  359. public bool IsOk { get; set; }

  360. }

  361. public class ImportProduct3Dto

  362. {

  363. /// <summary>

  364. /// 产品名称

  365. /// </summary>

  366. [ImporterHeader(Name = "产品名称", Description = "必填")]

  367. [Required(ErrorMessage = "产品名称是必填的")]

  368. public string Name { get; set; }

  369. /// <summary>

  370. /// 产品代码

  371. /// </summary>

  372. [ImporterHeader(Name = "产品代码", Description = "最大长度为8")]

  373. [MaxLength(8, ErrorMessage = "产品代码最大长度为8")]

  374. public string Code { get; set; }

  375. /// <summary>

  376. /// 产品条码

  377. /// </summary>

  378. [ImporterHeader(Name = "产品条码")]

  379. [MaxLength(10, ErrorMessage = "产品条码最大长度为10")]

  380. [RegularExpression(@"^\d*$", ErrorMessage = "产品条码只能是数字")]

  381. public string BarCode { get; set; }

  382. /// <summary>

  383. /// 客户Id

  384. /// </summary>

  385. [ImporterHeader(Name = "客户代码")]

  386. public long ClientId { get; set; }

  387. /// <summary>

  388. /// 产品型号

  389. /// </summary>

  390. [ImporterHeader(Name = "产品型号")]

  391. public string Model { get; set; }

  392. /// <summary>

  393. /// 申报价值

  394. /// </summary>

  395. [ImporterHeader(Name = "申报价值")]

  396. public double DeclareValue { get; set; }

  397. /// <summary>

  398. /// 货币单位

  399. /// </summary>

  400. [ImporterHeader(Name = "货币单位")]

  401. public string CurrencyUnit { get; set; }

  402. /// <summary>

  403. /// 品牌名称

  404. /// </summary>

  405. [ImporterHeader(Name = "品牌名称")]

  406. public string BrandName { get; set; }

  407. /// <summary>

  408. /// 尺寸

  409. /// </summary>

  410. [ImporterHeader(Name = "尺寸(长x宽x高)")]

  411. public string Size { get; set; }

  412. /// <summary>

  413. /// 重量

  414. /// </summary>

  415. [ImporterHeader(Name = "重量(KG)")]

  416. public double Weight { get; set; }

  417. /// <summary>

  418. /// 类型

  419. /// </summary>

  420. [ImporterHeader(Name = "类型")]

  421. public ImporterProductType Type { get; set; }

  422. /// <summary>

  423. /// 是否行

  424. /// </summary>

  425. [ImporterHeader(Name = "是否行")]

  426. public bool IsOk { get; set; }

  427. }

  428. public enum ImporterProductType

  429. {

  430. [Display(Name = "第一")]

  431. One,

  432. [Display(Name = "第二")]

  433. Two

  434. }

  435. }