【转】使用Docx.Core创建word表格
原文地址: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
/// <summary>
/// 表格
/// </summary>
public class TableDto
{
/// <summary>
/// 表头
/// </summary>
public List<List<TableTdDto>> TRS { get; set; }
/// <summary>
/// 表内容
/// </summary>
public List<List<TableTdDto>> TDS { get; set; }
}
TableTdDto.cs
/// <summary>
/// 表格TD属性
/// </summary>
public class TableTdDto
{
/// <summary>
/// 宽度比例
/// </summary>
public int W { get; set; }
/// <summary>
/// 内容
/// </summary>
public string N { get; set; }
/// <summary>
/// 占列数,对应 colspan
/// </summary>
public int CL { get; set; } = 1;
/// <summary>
/// 占行数,对应 rowspan
/// </summary>
public int RL { get; set; } = 1;
/// <summary>
/// 个数,扩展
/// </summary>
public int C1 { get; set; } = 0;
/// <summary>
/// 样式
/// </summary>
public string S { get; set; }
}
使用Docx创建表格
public class DocxHelper
{ /// <summary>
/// 创建word
/// </summary>
/// <param name="dto"></param>
public static void CreateWord(TableDocumentDto dto)
{
var uploadPath = AppDomain.CurrentDomain.BaseDirectory;
string fileName = string.Format("{0}.docx", dto.Title, System.Text.Encoding.UTF8);
// Create a document.
using (var document = DocX.Create(uploadPath+fileName))
{
var first = dto.Table.TRS.FirstOrDefault();
var cols = first.Sum(o => o.CL);
var rows = dto.Table.TRS.Count + dto.Table.TDS.Count;
var headerTable = dto.Table.TRS;
var w = first.Sum(o => o.W);
var allWidth = w == 0 ? 5200 : w;
Table table1 = document.AddTable(rows, cols);
table1.Design = TableDesign.TableGrid; //表格样式
table1.Alignment = Alignment.center; //设置表格居中
headerTable.AddRange(dto.Table.TDS);
for (int i = 0; i < headerTable.Count; i++)
{
if (table1.Rows.Count < headerTable.Count)
{
throw new Exception("请检查表格参数");
}
var rol = headerTable[i].Max(o => o.RL);
int a = 0;//表示起始列位置
for (int j = 0; j < headerTable[i].Count; j++)
{
if (table1.Rows[i].Cells.Count < headerTable[i].Count)
{
throw new Exception("请检查表格参数");
}
if (headerTable[i][j].CL > 1 && headerTable[i][j].RL > 1)
{
throw new Exception("当前无法同时合并行和列");
}
var width = headerTable[i][j].W == 0 ? 120 : headerTable[i][j].W;
//当前合并列
if (headerTable[i][j].CL > 1)
{
//当前需要合并列
//MergeCells(起始列,结束列);
table1.Rows[i].MergeCells(a, (headerTable[i][j].CL - 1) + a);//合并列
table1.Rows[i].Cells[a].Paragraphs[0].Append(headerTable[i][j].N).Bold(); a += headerTable[i][j].CL - 1;
}
else if (headerTable[i][j].RL > 1)
{
//当前需要合并行
//MergeCellsInColumn(起始列,起始行,结束行)
table1.MergeCellsInColumn(j, i, (i+headerTable[i][j].RL) - 1);//合并行
table1.Rows[i].Cells[a].Paragraphs[0].Append(headerTable[i][j].N).Bold();
a++;
}
else
{
table1.Rows[i].Cells[a].Paragraphs[0].Append(headerTable[i][j].N).Bold();
a++;
}
}
}
//table1.MergeCellsInColumn(2, 2, 3);
//table1.Rows[0].Cells[0].Paragraphs[0].Append("列1").Bold();
//table1.Rows[0].Cells[1].Paragraphs[0].Append("列2").Bold();
//table1.Rows[0].Cells[0].Width = 100; //设置单元格宽度
//table1.Rows[0].Cells[1].Width = 100;
//table1.Rows[1].MergeCells(1, 2);
//table1.Rows[1].Cells[1].Paragraphs[0].Append("列2").Bold(); Paragraph p = document.InsertParagraph();
p.Alignment = Alignment.center;
p.Append(dto.Title).Bold();
p.InsertTableAfterSelf(table1); document.Save();
Console.WriteLine($"表【{dto.Title}.docx】创建成功");
}
}
}
在使用时 行和列一起合并的时候出现索引无法找到问题 所以现在无法进行行列一起合并 只能单独合并
一定要正确定义TableDto 使用CL和RL可进行合并,但不能同时使用 每一列都是固定的 例如
list集合里有7条数据 其中有一条数据进行了合并占用了两格
所以有8列数据 那么以下所有的数据都最多只能占用8列,超出将会报错
如果要上传图片的话 使用以下方法 将图片放置在单元格中
var image = document.AddImage(@"D:/其他文件/图片/" + @"logo.png");
// Create a picture from image.
var picture = image.CreatePicture(25, 100);
table1.Rows[i].Cells[a].Paragraphs[0].AppendPicture(picture);//第一张图
table1.Rows[i].Cells[a].Paragraphs[0].AppendPicture(picture);//第二张图
table1.Rows[i].Cells[a].Paragraphs[0].AppendPicture(picture);//第三张图
//当前图片都放置在同一单元格中
测试
class Program
{
static void Main(string[] args)
{
var filePath = @"D:\文档\标题2.docx";
var list = new List<List<TableTdDto>>();
list.Add(new List<TableTdDto>() {
new TableTdDto(){
N = "序号",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "检查项目",
CL = 2,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "扣分标准",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "应得分数",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "扣减分数",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "实得分数",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "备注",
CL = 1,
RL = 1,
W = 10,
}, });
var tes = new List<List<TableTdDto>>();
tes.Add(new List<TableTdDto>() {
new TableTdDto(){
N = "这是序号",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "保证项目",
CL = 1,
RL = 6,
W = 10,
},
new TableTdDto(){
N = "安全生产责任制",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = @"测试数据",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = @"10",
CL = 1,
RL = 1,
W = 10,
}
}); var tableTd = new List<TableTdDto>();
for (int i = 0; i < 5; i++)
{
tableTd.Add(new TableTdDto()
{
N = "测试数据",
CL = 1,
RL = 1,
W = 10,
});
tes.Add(tableTd);
} tes.Add(new List<TableTdDto>() {
new TableTdDto(){
N = "1",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = "一般项目",
CL = 1,
RL = 5,
W = 10,
},
new TableTdDto(){
N = "安全生产责任制",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = @"测试数据",
CL = 1,
RL = 1,
W = 10,
},
new TableTdDto(){
N = @"10",
CL = 1,
RL = 1,
W = 10,
}
}); var tableTds = new List<TableTdDto>();
for (int i = 0; i < 4; i++)
{
tableTds.Add(new TableTdDto()
{
N = "测试数据",
CL = 1,
RL = 1,
W = 10,
});
tes.Add(tableTd);
}
var data = new TableDocumentDto()
{
Title = "安全管理检查评分表",
Table = new TableDto() {
TDS = tes,
TRS = list
}
}; DocxHelper.CreateWord(data); Console.ReadKey();
}
}
END
文档太少,例子太少,只有一步一步的试每个方法.最开始用的NPOI
但是NPOI文档都找不到了,合并列还行,到合并行的时候就没办法了,按照其他博客进行操作,太复杂,也没有解释属性和方法的意思,造成即使写了出现错误也不知道为什么会出现这个问题.
Docx虽然文档也没有找到 但是靠猜方法找到了合并行和列的方法 解决了我的问题
例子:https://github.com/xceedsoftware/DocX/tree/master/Xceed.Words.NET.Examples/Samples
【转】使用Docx.Core创建word表格的更多相关文章
- 如何通过Java应用程序创建Word表格
表格,又称为表,既是一种可视化交流模式,又是一种组织整理数据的手段.人们在通讯交流.科学研究以及数据分析活动当中广泛采用着形形色色的表格.那么如何通过Java应用程序创建Word表格呢?别担心,本文将 ...
- 使用POI创建word表格合并单元格兼容wps
poi创建word表格合并单元格代码如下: /** * @Description: 跨列合并 */ public void mergeCellsHorizontal(XWPFTable table, ...
- 使用POI创建word表格-在表格单元格中创建子表格
要实现的功能如下:表格中的单元格中有子表格 实现代码如下: XWPFParagraph cellPara = row.getCell(j).getParagraphArray(0); //row.ge ...
- Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行
本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...
- Python批量创建word文档(2)- 加图片和表格
Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.要求在文档开始处给出banner条,价格日期等用表格表示.最后贴上自己的联系 ...
- poi导出word表格跨行
DataCommon.java package com.ksource.pwlp.model.statistic; public class DataCommon { private Long id; ...
- 如何使用免费控件将Word表格中的数据导入到Excel中
我通常使用MS Excel来存储和处理大量数据,但有时候经常会碰到一个问题—我需要的数据存储在word表格中,而不是在Excel中,这样处理起来非常麻烦,尤其是在数据比较庞大的时候, 这时我迫切地需要 ...
- C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表
调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...
- [java,2017-05-04] 创建word文档
package test; import java.text.SimpleDateFormat; import java.util.Date; import com.aspose.words.Data ...
随机推荐
- Entropy, relative entropy and mutual information
目录 Entropy Joint Entropy Conditional Entropy Chain rule Mutual Information Relative Entropy Chain Ru ...
- 使用Xcode 制作自定义storyboard启动界面,供uniAPP使用。
1新建项目 想要全屏显示并适应所有尺寸的iPad和iphone 需要用750*1624 2X 和 1125 * 2436 3X大小的图片 这里做完就可以导出文件了 把文件和图片放到一起 见下图 命名规 ...
- CapstoneCS5210|HDMI转VGA音视频转接线|CS5210转换器方案芯片
Capstone最新推出的一款HDMI转VGA音视频转接线或者转换器方案芯片CS5210. 其设计的优势在于内置晶振,外围电路器件较少设计简单,芯片封装集成度较高,方案BOM成本低,相比其他方案产品更 ...
- 从JVM设计角度解读Java内存模型
第十六章:Java内存模型 本文我们将重点放在Java内存模型(JMM)的一些高层设计问题,以及JMM的底层需求和所提供的保证,还有一些高层设计原则背后的原理. 例如安全发布,同步策略的规范以及一致性 ...
- Java初学者作业——编写 Java 程序,定义 Java 类 (Point) 用来表示坐标,坐标范围在(0,0)到(100,100)以内,并显示合法的坐标在控制台。
返回本章节 返回作业目录 需求说明: 编写 Java 程序,定义 Java 类 Point 用来表示坐标,坐标范围在(0,0)到(100,100)以内,并显示合法的坐标在控制台. 实现思路: 定义 P ...
- Oracle的dbf文件迁移
1.背景说明 在Oracle数据库中插入了1.5亿条数据, 并且创建了主键索引, 又插入了1.5亿条数据到另外一张表, 导致数据库表空间暴涨到28G, 由于根目录下只有50G的空间, 数据库文件所在磁 ...
- lombok不支持enum类型
今天在使用枚举时想着少写getter方法和构造方法,结果加上注解后说是只支持class类型 来自为知笔记(Wiz)
- 详解nohup /dev/null 2>&1 含义的使用
https://www.jb51.net/article/169837.htm 这篇文章主要介绍了详解nohup /dev/null 2>&1 含义的使用,文中通过示例代码介绍的非常详细 ...
- docker的安装以及使用命令
docker的安装 安装docker https://docs.docker.com/install/linux/docker-ce/centos/#set-up-the-repository 从 2 ...
- Linux基础之终端、控制台、tty、pty简介说明
最近在搞Linux提权的时候,有时候su 用户名 登录的时候发现登录不了,因为tty终端,交互不了,所以我也来总结一下 一. 基本概念 1. ttytty(终端设备的统称):tty一词源于telety ...