码迷,mamicode.com
首页 > Web开发 > 详细

通过Aspose.Word和ZXING生成复杂的WORD表格

时间:2018-10-10 23:40:48      阅读:536      评论:0      收藏:0      [点我收藏+]

标签:基本   owa   信息   单元   col   分页符   blank   根据   previous   

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文件我也做了链接,要是有什么问题可以留言交流。

通过Aspose.Word和ZXING生成复杂的WORD表格

标签:基本   owa   信息   单元   col   分页符   blank   根据   previous   

原文地址:https://www.cnblogs.com/xwc1996/p/9768807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!