通過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文件我也做了鏈接,要是有什麽問題可以留言交流。
通過Aspose.Word和ZXING生成復雜的WORD表格