1. 程式人生 > >通過Aspose.Word和ZXING生成復雜的WORD表格

通過Aspose.Word和ZXING生成復雜的WORD表格

utf-8 src 文字 create hal info lin 需要 line

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表格