通过Aspose.Word和ZXING生成复杂的WORD表格
1.前言
这是我之前做的一个项目中要求的功能模块,它的需求是生成一个WORD文档,需要每页一个表格并且表格中需要插入文字、条形码和二维码等信息,页数可控制。具体的效果如下图所示:

可以看到有以下几点是我需要解决的重点:
1.如何生成WORD并插入表格和文字;
2.如何合并表格的单元格;
3.如何生成二维码和条形码并且插入到表格中;
4.如何对WORD分页;
可以说只要解决了这几点这个功能就解决了,一开始我是想用Microsoft.Office.Interop.Word来生成WORD的但是感觉比较的麻烦并且之前没有使用过,但是Aspose是有接触的感觉比较的好用,就决定使用Aspose.Word来完成这个WORD的生成,接着在网上找了一个比较好的zxing来生成二维码和条形码图片。接着就来一步一步的解决问题啦。
2.具体的解决方法
(1)如何生成WORD并插入表格和文字
首先先引用Aspose.Word.dll,然后生成一个Document的对象并初始化到DocumentBuilder对象中用于编辑文字、样式、表格等内容。具体的代码如下所示:
var doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
//编辑文档样式
builder.CellFormat.VerticalAlignment=CellVerticalAlignment.Center;//垂直居中对齐
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中对齐
Aspose.Words.Font font = builder.Font;
//编辑文字样式和插入文字,Writeln问插入并换行,Write只是插入文字
font.Size = ;
font.Bold = true;
font.Name = "Arial";
builder.Writeln("工序流转卡");
ont.Bold = false;
font.Size = ;
builder.ParagraphFormat.Alignment = ParagraphAlignment.Right;
builder.Write("流水号:");
接着需要插入表格,这里是DocumentBuilder有StartTable方法可以开始创建表格和EndTable方法结束创建表格,之后由InsertCell方法插入单元格,并以EndRow结束该行的创建,后用Save方法保存为数据流的形式传送就好了。具体代码如下所示:
//表格开始编辑
builder.StartTable();
//编辑行样式
builder.RowFormat.Alignment = RowAlignment.Center;
builder.RowFormat.Height = ;
//编辑单元格样式
builder.CellFormat.Width = ;
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = Color.Black;
//循环插入单元格
for (int i = ; i < colName.Count(); i++)
{
builder.InsertCell();
builder.CellFormat.Width = colWidth[i];
builder.Write(colName[i]);
}
//行插入结束
builder.EndRow();
//表格结束编辑
builder.EndTable();
//保存文件
var docStream = new MemoryStream();
doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
这样一个最为基本的WORD就完成啦。
(2)如何合并表格的单元格
单元格的合并主要使用DocumentBuilder.CellFormat.VerticalMerge的属性设置,有CellMerge.None、CellMerge.First和CellMerge.Previous。这个就直接贴代码如下:
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.First;//合并的最顶部的单元格用First
builder.CellFormat.Width = ;
builder.Write(colBottomNam[i]);
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.First;
builder.CellFormat.Width = ;
builder.Write("");
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.None;//不合并的单元格设置为None
builder.CellFormat.Width = ;
builder.Write("检验员");
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.None;
builder.CellFormat.Width = ;
builder.Write("");
builder.EndRow(); builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.Previous;//除合并的最顶部的单元格外其他合并单元格全部设置为Previous
builder.CellFormat.Width = ;
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.Previous;
builder.CellFormat.Width = ;
builder.Write("");
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.None;
builder.CellFormat.Width = ;
builder.Write("日期");
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.VerticalMerge = CellMerge.None;
builder.CellFormat.Width = ;
builder.Write("");
builder.EndRow();
(3)如何生成二维码和条形码并且插入到表格中
二维码和条形码的生成这里引用了zxing.dll,可以选择生成二维码或者条形码并且设置相应的参数,如宽高和编码格式等。图片的插入有DocumentBuilder.InsertImage这个方法有多个重载,我这里选择通过数据流的方式传入,所以二维码和条形码生成后需要转为相应的形式。代码如下所示:
//条形码生成
public Stream CreateTxm(string str)
{
//设置条形码规格
EncodingOptions encodeOption = new EncodingOptions();
//设置宽和高
encodeOption.Height = ;
encodeOption.Width = ;
BarcodeWriter wr = new BarcodeWriter();
wr.Options = encodeOption;
//条形码:根据自己的需要选择条形码格式
//wr.Format = BarcodeFormat.CODE_39;
wr.Format = BarcodeFormat.CODE_128;
//生成条形码
Bitmap image = wr.Write(str);
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
return stream;
} //二维码生成
public Stream CreateQr(string str)
{
//设置QR二维码的规格
QrCodeEncodingOptions qrEncodeOption = new QrCodeEncodingOptions();
//设置编码格式,否则中文乱码
qrEncodeOption.CharacterSet = "UTF-8";
//设置宽和高
qrEncodeOption.Height = ;
qrEncodeOption.Width = ;
//设置周围空白边距
qrEncodeOption.Margin = ;
BarcodeWriter wr = new BarcodeWriter();
//二维码
wr.Format = BarcodeFormat.QR_CODE;
wr.Options = qrEncodeOption;
//生成二维码
Bitmap image = wr.Write(str);
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
return stream;
}
(4)如何对WORD分页
分页的话只用一行代码就行了,直接贴代码:
builder.InsertBreak(BreakType.PageBreak);//插入分页符
3.总结
上述用到了基本的Aspose.WORD生成WORD文件的基本方法,最后的生成方法我就不汇总了,大家根据自己的情况自行处理吧,当然还有更复杂的表格等内容的生成,我这里没有提到,相应的DLL文件我也做了链接,要是有什么问题可以留言交流。
通过Aspose.Word和ZXING生成复杂的WORD表格的更多相关文章
- 使用NPOI按照word模板文件生成新的word文件
/// <summary> /// 按照word模板文件 生成新word文件 /// </summary> /// <param name="tempFile& ...
- 随手记一次利用开源zxing生成带嵌入logo的二维码图片
之前就在项目里面用过zxing生成二维码,最近另一个项目同样需要用到二维码,故重新在学了学利用zxing生成二维码 接下来先做准备工作了,因为我是用vs2013上开发的,故选择了.net4.5版本的z ...
- PHP生成 excl、word文件
PHP生成 excl.word文件 $time = time(); $filename = date("Y年m月d日h点m分s秒", $time).'问卷数据'; $rows ...
- C#读取Word模板替换相应的字符串(标签)生成新的Word
在平常工作中,生成word的方式主要是C#读取html的模板文件处理之后保存为.doc文件,这样的好处是方便,快捷,能满足大部分的需求.不过有些特殊的需求并不能满足,如要生成的Word为一个表格,只是 ...
- 利用html模板生成Word文件(服务器端不需要安装Word)
利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...
- zxing生成和解析二维码
今天忙了一天的二维码,用了QRcode和ZXing两个开源包.结果发现 ZXing比QRcode更好用一些,它直接可以定义二维码生成图案的大小,而QRcode生成的二维码是根据二维码包含的内容多少来定 ...
- C# WebForm 使用NPOI 2 生成简单的word文档(.docx)
使用NPOI可以方便的实现服务端对Word.Excel的读写.要实现对Word的读写操作,需要引用NPOI.OOXML.dll,应用命名空间XWPF. 本文使用NPOI 2.0实现对Word的基本生成 ...
- Aspose.Words:如何添加另一个WORD文档中的Node对象
原文:Aspose.Words:如何添加另一个WORD文档中的Node对象 首先看一段代码,这段代码意图从docSource中获取第一个表格,并插入docTarget的末尾: , true); doc ...
- ZXing 生成、解析二维码图片的小示例
概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...
随机推荐
- android api 之Scroller
Scroller是封装了滚动,实现View和ViewGroup的背景画布的滚动. 它有两个构造方法: public Scroller (Context context) 传递一个上下文. public ...
- 【起航计划 009】2015 起航计划 Android APIDemo的魔鬼步伐 08 App->Activity->QuickContactsDemo 联系人 ResourceCursorAdapter使用 QuickContactBadge使用
QuickContactsDemo示例介绍了如何使用Content Provider来访问Android系统的Contacts 数据库. Content Provider为不同应用之间共享数据提供了统 ...
- 分布式系统ID生成方案汇总
在分布式系统中,需要对大量的数据.消息.请求等进行唯一的标识,例如分布式数据库的ID需要满足唯一且多数据库同步,在单一系统中,使用数据库自增主键可以满足需求,但是在分布式系统中就需要一个能够生成全局唯 ...
- 搭建Web开发环境JavaEE_Eclipse
1. 下载和安装1.1 下载JDK在Java官方网站下载最新版本的 Java SE: http://www.oracle.com/technetwork/java/javase/downloads/ ...
- Linux远程桌面(二)
上一篇远程桌面采用的独立服务配置不适用于过多用户,这一篇采用超级Internet服务器搭建vnc服务可以解决多用户问题. vnc之xinetd服务搭建配置 Linux远程桌面(一):vnc之独立服务 ...
- 网页打开速度优化——HTTP请求头及响应头
no-cache:不缓存过期的资源 no-store:不缓存 最近看了<图解HTTP>这本书,书上讲到了这两者的区别: no-cache从字面意义上很容易误解为不缓存,但是no-cache ...
- MySQL入门很简单: 9 插入 更新与删除数据
1. 插入数据:INSERT 1)为表的所有字段插入数据 第一种: 不指定具体的字段名 INSERT INTO 表名 VALUES(值1,值2,...,值n): 第二种:INSERT语句中列出所有字段 ...
- 2018.8.2 Juint测试介绍及其命名的规范
JUnit - 测试框架 什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能够轻松完成以 ...
- 剑指offer52 构建乘积数组
这个题的错误和c++ primier中名字的作用域例子相似.只是这里将int换成了vecto<int>这种形式. class Solution { public: vector<in ...
- P1823 Patrik 音乐会的等待
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟进行谈笑风生.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看 ...