通过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 ...
随机推荐
- Struts2_Struts标签大致内容
Struts-Tags1.通用标签 a) property b) set i.默认为 action scope,会将值放入 request 和 ActionContext中 ii. page.requ ...
- Struts2_Action和Result总结
Action 1.实现一个Actiond的最常用方式:从ActionSupport继承2.DMI动态方法调用3.通配符配置 *{1}{2}... a) *_*4.接收参数的方法(一般用属性或者Doma ...
- springboot/springmvc转换器
常用的转换器 String转Date转换器(用于接受日期参数自动转换成Date类型便于后台数据处理) /** * 全局handler前日期统一处理 * @author zhanghang * @dat ...
- redhat7.3忘记root密码后如何重置root密码
redhat7系如果忘记root密码,重置密码方法与redhat6系不同! 1.开机启动系统,在grub选择启动内核项时 按‘e’进入编辑模式 2.这时看到的参数并不全,要按上下键滚动显示, 3.在l ...
- Leetcode back(215) to be continue
solution discussion https://leetcode.com/problems/kth-largest-element-in-an-array/description/ -- 21 ...
- setTimeout详解
一.setTimeout基础 setTimeout(func|code,delay); 第一个参数表示将要推迟的函数名或者一段代码,第二个参数表示推迟执行的毫秒数 eg: console.log( ...
- 【转】Android UI开发第三十一篇——Android的Holo Theme
好长时间没写Android UI方面的文章了,今天就闲扯一下Android的Holo主题.一直做android开发的可能都知道,Android 系统的UI有过两次大的变化,一次是android 3.0 ...
- WPF中TreeView单击展开其子元素以及点击一个元素展开其他元素收起
TreeView单击展开其子元素: 在WPF的TreeView控件中,要想展开它的子元素,我们必须要鼠标左键点两下或者右键点一下,那么我们怎样实现左键点一下就使它展开呢? Xaml: <Grid ...
- Java8函数之旅 (二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- jQuery 二级联动
jQuery 二级联动 ----请选择省份---- 北京 上海 江苏 ----请选择城市---- 东城 西城 崇文 宣武 朝阳 黄浦 卢湾 徐汇 长宁 静安 南京 镇江 苏州 南通 扬州 & ...