原文地址:https://www.cnblogs.com/qs315/p/13533765.html

使用Docx.Core创建word表格

下载DocxCore Nuget包 当前版本 1.0.7

Install-Package DocxCore -Version 1.0.7

创建表格参数

TableDto.cs

  1. /// <summary>
  2. /// 表格
  3. /// </summary>
  4. public class TableDto
  5. {
  6. /// <summary>
  7. /// 表头
  8. /// </summary>
  9. public List<List<TableTdDto>> TRS { get; set; }
  10. /// <summary>
  11. /// 表内容
  12. /// </summary>
  13. public List<List<TableTdDto>> TDS { get; set; }
  14. }

 

TableTdDto.cs

  1. /// <summary>
  2. /// 表格TD属性
  3. /// </summary>
  4. public class TableTdDto
  5. {
  6. /// <summary>
  7. /// 宽度比例
  8. /// </summary>
  9. public int W { get; set; }
  10. /// <summary>
  11. /// 内容
  12. /// </summary>
  13. public string N { get; set; }
  14. /// <summary>
  15. /// 占列数,对应 colspan
  16. /// </summary>
  17. public int CL { get; set; } = 1;
  18. /// <summary>
  19. /// 占行数,对应 rowspan
  20. /// </summary>
  21. public int RL { get; set; } = 1;
  22. /// <summary>
  23. /// 个数,扩展
  24. /// </summary>
  25. public int C1 { get; set; } = 0;
  26. /// <summary>
  27. /// 样式
  28. /// </summary>
  29. public string S { get; set; }
  30. }

  

使用Docx创建表格

  1. public class DocxHelper
  2. {
  3.  
  4. /// <summary>
  5. /// 创建word
  6. /// </summary>
  7. /// <param name="dto"></param>
  8. public static void CreateWord(TableDocumentDto dto)
  9. {
  10. var uploadPath = AppDomain.CurrentDomain.BaseDirectory;
  11. string fileName = string.Format("{0}.docx", dto.Title, System.Text.Encoding.UTF8);
  12. // Create a document.
  13. using (var document = DocX.Create(uploadPath+fileName))
  14. {
  15. var first = dto.Table.TRS.FirstOrDefault();
  16. var cols = first.Sum(o => o.CL);
  17. var rows = dto.Table.TRS.Count + dto.Table.TDS.Count;
  18. var headerTable = dto.Table.TRS;
  19. var w = first.Sum(o => o.W);
  20. var allWidth = w == 0 ? 5200 : w;
  21. Table table1 = document.AddTable(rows, cols);
  22. table1.Design = TableDesign.TableGrid; //表格样式
  23. table1.Alignment = Alignment.center; //设置表格居中
  24. headerTable.AddRange(dto.Table.TDS);
  25. for (int i = 0; i < headerTable.Count; i++)
  26. {
  27. if (table1.Rows.Count < headerTable.Count)
  28. {
  29. throw new Exception("请检查表格参数");
  30. }
  31. var rol = headerTable[i].Max(o => o.RL);
  32. int a = 0;//表示起始列位置
  33. for (int j = 0; j < headerTable[i].Count; j++)
  34. {
  35. if (table1.Rows[i].Cells.Count < headerTable[i].Count)
  36. {
  37. throw new Exception("请检查表格参数");
  38. }
  39. if (headerTable[i][j].CL > 1 && headerTable[i][j].RL > 1)
  40. {
  41. throw new Exception("当前无法同时合并行和列");
  42. }
  43. var width = headerTable[i][j].W == 0 ? 120 : headerTable[i][j].W;
  44. //当前合并列
  45. if (headerTable[i][j].CL > 1)
  46. {
  47. //当前需要合并列
  48. //MergeCells(起始列,结束列);
  49. table1.Rows[i].MergeCells(a, (headerTable[i][j].CL - 1) + a);//合并列
  50. table1.Rows[i].Cells[a].Paragraphs[0].Append(headerTable[i][j].N).Bold();
  51.  
  52. a += headerTable[i][j].CL - 1;
  53. }
  54. else if (headerTable[i][j].RL > 1)
  55. {
  56. //当前需要合并行
  57. //MergeCellsInColumn(起始列,起始行,结束行)
  58. table1.MergeCellsInColumn(j, i, (i+headerTable[i][j].RL) - 1);//合并行
  59. table1.Rows[i].Cells[a].Paragraphs[0].Append(headerTable[i][j].N).Bold();
  60. a++;
  61. }
  62. else
  63. {
  64. table1.Rows[i].Cells[a].Paragraphs[0].Append(headerTable[i][j].N).Bold();
  65. a++;
  66. }
  67. }
  68. }
  69. //table1.MergeCellsInColumn(2, 2, 3);
  70. //table1.Rows[0].Cells[0].Paragraphs[0].Append("列1").Bold();
  71. //table1.Rows[0].Cells[1].Paragraphs[0].Append("列2").Bold();
  72. //table1.Rows[0].Cells[0].Width = 100; //设置单元格宽度
  73. //table1.Rows[0].Cells[1].Width = 100;
  74. //table1.Rows[1].MergeCells(1, 2);
  75. //table1.Rows[1].Cells[1].Paragraphs[0].Append("列2").Bold();
  76.  
  77. Paragraph p = document.InsertParagraph();
  78. p.Alignment = Alignment.center;
  79. p.Append(dto.Title).Bold();
  80. p.InsertTableAfterSelf(table1);
  81.  
  82. document.Save();
  83. Console.WriteLine($"表【{dto.Title}.docx】创建成功");
  84. }
  85. }
  86. }

  

在使用时 行和列一起合并的时候出现索引无法找到问题 所以现在无法进行行列一起合并 只能单独合并

一定要正确定义TableDto 使用CL和RL可进行合并,但不能同时使用 每一列都是固定的 例如 list集合里有7条数据 其中有一条数据进行了合并占用了两格
所以有8列数据 那么以下所有的数据都最多只能占用8列,超出将会报错

如果要上传图片的话 使用以下方法 将图片放置在单元格中

  1. var image = document.AddImage(@"D:/其他文件/图片/" + @"logo.png");
  2. // Create a picture from image.
  3. var picture = image.CreatePicture(25, 100);
  4. table1.Rows[i].Cells[a].Paragraphs[0].AppendPicture(picture);//第一张图
  5. table1.Rows[i].Cells[a].Paragraphs[0].AppendPicture(picture);//第二张图
  6. table1.Rows[i].Cells[a].Paragraphs[0].AppendPicture(picture);//第三张图
  7. //当前图片都放置在同一单元格中

  

测试

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var filePath = @"D:\文档\标题2.docx";
  6. var list = new List<List<TableTdDto>>();
  7. list.Add(new List<TableTdDto>() {
  8. new TableTdDto(){
  9. N = "序号",
  10. CL = 1,
  11. RL = 1,
  12. W = 10,
  13. },
  14. new TableTdDto(){
  15. N = "检查项目",
  16. CL = 2,
  17. RL = 1,
  18. W = 10,
  19. },
  20. new TableTdDto(){
  21. N = "扣分标准",
  22. CL = 1,
  23. RL = 1,
  24. W = 10,
  25. },
  26. new TableTdDto(){
  27. N = "应得分数",
  28. CL = 1,
  29. RL = 1,
  30. W = 10,
  31. },
  32. new TableTdDto(){
  33. N = "扣减分数",
  34. CL = 1,
  35. RL = 1,
  36. W = 10,
  37. },
  38. new TableTdDto(){
  39. N = "实得分数",
  40. CL = 1,
  41. RL = 1,
  42. W = 10,
  43. },
  44. new TableTdDto(){
  45. N = "备注",
  46. CL = 1,
  47. RL = 1,
  48. W = 10,
  49. },
  50.  
  51. });
  52. var tes = new List<List<TableTdDto>>();
  53. tes.Add(new List<TableTdDto>() {
  54. new TableTdDto(){
  55. N = "这是序号",
  56. CL = 1,
  57. RL = 1,
  58. W = 10,
  59. },
  60. new TableTdDto(){
  61. N = "保证项目",
  62. CL = 1,
  63. RL = 6,
  64. W = 10,
  65. },
  66. new TableTdDto(){
  67. N = "安全生产责任制",
  68. CL = 1,
  69. RL = 1,
  70. W = 10,
  71. },
  72. new TableTdDto(){
  73. N = @"测试数据",
  74. CL = 1,
  75. RL = 1,
  76. W = 10,
  77. },
  78. new TableTdDto(){
  79. N = @"10",
  80. CL = 1,
  81. RL = 1,
  82. W = 10,
  83. }
  84. });
  85.  
  86. var tableTd = new List<TableTdDto>();
  87. for (int i = 0; i < 5; i++)
  88. {
  89. tableTd.Add(new TableTdDto()
  90. {
  91. N = "测试数据",
  92. CL = 1,
  93. RL = 1,
  94. W = 10,
  95. });
  96. tes.Add(tableTd);
  97. }
  98.  
  99. tes.Add(new List<TableTdDto>() {
  100. new TableTdDto(){
  101. N = "1",
  102. CL = 1,
  103. RL = 1,
  104. W = 10,
  105. },
  106. new TableTdDto(){
  107. N = "一般项目",
  108. CL = 1,
  109. RL = 5,
  110. W = 10,
  111. },
  112. new TableTdDto(){
  113. N = "安全生产责任制",
  114. CL = 1,
  115. RL = 1,
  116. W = 10,
  117. },
  118. new TableTdDto(){
  119. N = @"测试数据",
  120. CL = 1,
  121. RL = 1,
  122. W = 10,
  123. },
  124. new TableTdDto(){
  125. N = @"10",
  126. CL = 1,
  127. RL = 1,
  128. W = 10,
  129. }
  130. });
  131.  
  132. var tableTds = new List<TableTdDto>();
  133. for (int i = 0; i < 4; i++)
  134. {
  135. tableTds.Add(new TableTdDto()
  136. {
  137. N = "测试数据",
  138. CL = 1,
  139. RL = 1,
  140. W = 10,
  141. });
  142. tes.Add(tableTd);
  143. }
  144. var data = new TableDocumentDto()
  145. {
  146. Title = "安全管理检查评分表",
  147. Table = new TableDto() {
  148. TDS = tes,
  149. TRS = list
  150. }
  151. };
  152.  
  153. DocxHelper.CreateWord(data);
  154.  
  155. Console.ReadKey();
  156. }
  157. }

  

END

文档太少,例子太少,只有一步一步的试每个方法.最开始用的NPOI
但是NPOI文档都找不到了,合并列还行,到合并行的时候就没办法了,按照其他博客进行操作,太复杂,也没有解释属性和方法的意思,造成即使写了出现错误也不知道为什么会出现这个问题.

Docx虽然文档也没有找到 但是靠猜方法找到了合并行和列的方法 解决了我的问题

参考:https://www.cnblogs.com/liruihuan/p/6626515.html

参考:https://github.com/xceedsoftware/DocX/blob/master/Xceed.Words.NET.Examples/Samples/Table/TableSample.cs

例子:https://github.com/xceedsoftware/DocX/tree/master/Xceed.Words.NET.Examples/Samples

 

 

【转】使用Docx.Core创建word表格的更多相关文章

  1. 如何通过Java应用程序创建Word表格

    表格,又称为表,既是一种可视化交流模式,又是一种组织整理数据的手段.人们在通讯交流.科学研究以及数据分析活动当中广泛采用着形形色色的表格.那么如何通过Java应用程序创建Word表格呢?别担心,本文将 ...

  2. 使用POI创建word表格合并单元格兼容wps

    poi创建word表格合并单元格代码如下: /** * @Description: 跨列合并 */ public void mergeCellsHorizontal(XWPFTable table, ...

  3. 使用POI创建word表格-在表格单元格中创建子表格

    要实现的功能如下:表格中的单元格中有子表格 实现代码如下: XWPFParagraph cellPara = row.getCell(j).getParagraphArray(0); //row.ge ...

  4. Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  5. Python批量创建word文档(2)- 加图片和表格

    Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.要求在文档开始处给出banner条,价格日期等用表格表示.最后贴上自己的联系 ...

  6. poi导出word表格跨行

    DataCommon.java package com.ksource.pwlp.model.statistic; public class DataCommon { private Long id; ...

  7. 如何使用免费控件将Word表格中的数据导入到Excel中

    我通常使用MS Excel来存储和处理大量数据,但有时候经常会碰到一个问题—我需要的数据存储在word表格中,而不是在Excel中,这样处理起来非常麻烦,尤其是在数据比较庞大的时候, 这时我迫切地需要 ...

  8. C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表

    调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...

  9. [java,2017-05-04] 创建word文档

    package test; import java.text.SimpleDateFormat; import java.util.Date; import com.aspose.words.Data ...

随机推荐

  1. 2. node接口搭建--连接MongoDB数据库 (参考https://blog.csdn.net/ncepu_Chen/article/details/98725104#_337)

    1.使用mongoose连接MongoDB数据库 npm install mongoose 2.新建文件夹config存放数据库地址 3.安装MongoDB

  2. [c++]关于指针的一些问题记录

    const char* 和char* 之间的转换 const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常 ...

  3. Ranger-Usersync安装

    Ranger-Usersync安装, 配置数据源Unix,Usersync从Unix拉取Users/Groups的数据源, 对应的Ranger版本0.6.0. IP/机器名 安装软件 运行进程 zdh ...

  4. MATLAB 右键该文件不存在或者SIMULINK打开后仿真器件报错

    错误示例: 提示是否创建文件 并且会提示某某模块或者某某文件未找到not found 原因: .m文件不存在,是因为所打开的文件还并没有添加进matlab的搜索目录,或者是需要.m文件运行后生成的 某 ...

  5. mongdb分片

    实验环境 主机              IP                虚拟通道 centos1       192.168.3.10         vmnet8 centos2       ...

  6. CSS基础 精灵图的使用

    使用步骤1.创建盒子     <div class="one"></div>   2.使用PxCook量取图标大小,将图标的宽高设置成为盒子的宽高      ...

  7. 《手把手教你》系列技巧篇(五十五)-java+ selenium自动化测试-上传文件-下篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

  8. 基于ShardingJDBC的分库分表及读写分离整理

    ShardingJDBC的核心流程主要分成六个步骤,分别是:SQL解析->SQL优化->SQL路由->SQL改写->SQL执行->结果归并,流程图如下: sharding ...

  9. centos7-collabora-office(在线文档编辑)

    1.wget https://www.collaboraoffice.com/repos/CollaboraOnline/CODE-centos7/repodata/repomd.xml.key &a ...

  10. Vue项目中使用websocket

    <template> <div class="test"> </div> </template> <script> ex ...