zoukankan      html  css  js  c++  java
  • 通过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 = 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文件我也做了链接,要是有什么问题可以留言交流。

  • 相关阅读:
    买点
    正则
    burp回放
    py打包问题
    运行elementUI相关组件的时候的问题
    客户端性能(转载)
    客户端性能(转载)
    关于Appium android input manager for Unicode 提示信息
    selenium 分布式 [WinError 10061] 由于目标计算机积极拒绝
    WPF数据绑定-依赖属性
  • 原文地址:https://www.cnblogs.com/xwc1996/p/9768807.html
Copyright © 2011-2022 走看看