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 = 12; font.Bold = true; font.Name = "Arial"; builder.Writeln("工序流转卡"); ont.Bold = false; font.Size = 9; builder.ParagraphFormat.Alignment = ParagraphAlignment.Right; builder.Write("流水号:");
接着需要插入表格,这里是DocumentBuilder有StartTable方法可以开始创建表格和EndTable方法结束创建表格,之后由InsertCell方法插入单元格,并以EndRow结束该行的创建,后用Save方法保存为数据流的形式传送就好了。具体代码如下所示:
//表格开始编辑 builder.StartTable(); //编辑行样式 builder.RowFormat.Alignment = RowAlignment.Center; builder.RowFormat.Height = 30; //编辑单元格样式 builder.CellFormat.Width = 200; builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = Color.Black; //循环插入单元格 for (int i = 0; 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 = 80; builder.Write(colBottomNam[i]); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.VerticalMerge = CellMerge.First; builder.CellFormat.Width = 260; builder.Write(""); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.VerticalMerge = CellMerge.None;//不合并的单元格设置为None builder.CellFormat.Width = 40; builder.Write("检验员"); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.VerticalMerge = CellMerge.None; builder.CellFormat.Width = 60; builder.Write(""); builder.EndRow(); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.VerticalMerge = CellMerge.Previous;//除合并的最顶部的单元格外其他合并单元格全部设置为Previous builder.CellFormat.Width = 80; builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.VerticalMerge = CellMerge.Previous; builder.CellFormat.Width = 260; builder.Write(""); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.VerticalMerge = CellMerge.None; builder.CellFormat.Width = 40; builder.Write("日期"); builder.InsertCell(); builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.VerticalMerge = CellMerge.None; builder.CellFormat.Width = 60; builder.Write(""); builder.EndRow();
(3)如何生成二维码和条形码并且插入到表格中
二维码和条形码的生成这里引用了zxing.dll,可以选择生成二维码或者条形码并且设置相应的参数,如宽高和编码格式等。图片的插入有DocumentBuilder.InsertImage这个方法有多个重载,我这里选择通过数据流的方式传入,所以二维码和条形码生成后需要转为相应的形式。代码如下所示:
//条形码生成 public Stream CreateTxm(string str) { //设置条形码规格 EncodingOptions encodeOption = new EncodingOptions(); //设置宽和高 encodeOption.Height = 65; encodeOption.Width = 20; 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 = 50; qrEncodeOption.Width = 50; //设置周围空白边距 qrEncodeOption.Margin = 1; 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文件我也做了链接,要是有什么问题可以留言交流。
原文地址:https://www.cnblogs.com/xwc1996/p/9768807.html