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;//合并的最顶部的单元格用Firstbuilder.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;//不合并的单元格设置为Nonebuilder.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;//除合并的最顶部的单元格外其他合并单元格全部设置为Previousbuilder.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文件我也做了链接,要是有什么问题可以留言交流。
通过Aspose.Word和ZXING生成复杂的WORD表格
原文地址:https://www.cnblogs.com/xwc1996/p/9768807.html