1. 程式人生 > >c#對Aspose.Word替換書籤內容的簡單封裝

c#對Aspose.Word替換書籤內容的簡單封裝

輔助類1  json和datatable互轉:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization; //System.Web.Extensions.dll
using System.Collections;
using System.Data;

namespace Utils
{
    public static class JsonDataTableConvert
    {
        #region DataTable 轉換為Json 字串
        /// <summary>
        /// DataTable 物件 轉換為Json 字串
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static string ToJson(DataTable dt)
        {
            JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
            javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大數值
            ArrayList arrayList = new ArrayList();
            foreach (DataRow dataRow in dt.Rows)
            {
                Dictionary<string, object> dictionary = new Dictionary<string, object>();  //例項化一個引數集合
                foreach (DataColumn dataColumn in dt.Columns)
                {
                    dictionary.Add(dataColumn.ColumnName, dataRow[dataColumn.ColumnName].ToStr());
                }
                arrayList.Add(dictionary); //ArrayList集合中新增鍵值
            }

            return javaScriptSerializer.Serialize(arrayList);  //返回一個json字串
        }
        #endregion

        #region Json 字串 轉換為 DataTable資料集合
        /// <summary>
        /// Json 字串 轉換為 DataTable資料集合
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static DataTable ToDataTable(string json)
        {
            DataTable dataTable = new DataTable();  //例項化
            DataTable result;
            try
            {
                JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
                javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大數值
                ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
                if (arrayList.Count > 0)
                {
                    foreach (Dictionary<string, object> dictionary in arrayList)
                    {
                        if (dictionary.Keys.Count<string>() == 0)
                        {
                            result = dataTable;
                            return result;
                        }
                        if (dataTable.Columns.Count == 0)
                        {
                            foreach (string current in dictionary.Keys)
                            {
                                var obj = dictionary[current];
                                dataTable.Columns.Add(current,typeof(string) /*obj == null ? typeof(string) : obj.GetType()*/);//全當做字串處理
                            }
                        }
                        DataRow dataRow = dataTable.NewRow();
                        foreach (string current in dictionary.Keys)
                        {
                            dataRow[current] = dictionary[current];
                        }

                        dataTable.Rows.Add(dataRow); //迴圈新增行到DataTable中
                    }
                }
            }
            catch
            {
            }
            result = dataTable;
            return result;
        }
        #endregion

        #region 轉換為string字串型別
        /// <summary>
        ///  轉換為string字串型別
        /// </summary>
        /// <param name="s">獲取需要轉換的值</param>
        /// <param name="format">需要格式化的位數</param>
        /// <returns>返回一個新的字串</returns>
        public static string ToStr(this object s, string format = "")
        {
            string result = "";
            try
            {
                if (format == "")
                {
                    result = s.ToString();
                }
                else
                {
                    result = string.Format("{0:" + format + "}", s);
                }
            }
            catch
            {
            }
            return result;
        }
        #endregion
    } 
}

輔助類2  Excel表格資料和datatable互轉:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
using System.IO;
using System.Data;

namespace Utils
{
    //http://www.cnblogs.com/luxiaoxun/p/3374992.html
    public class ExcelDataTableConverter : IDisposable
    {
        private string fileName = null; //檔名
        private IWorkbook workbook = null;
        private FileStream fs = null;
        private bool disposed;

        public ExcelDataTableConverter(string fileName)
        {
            this.fileName = fileName;
            disposed = false;
        }

        /// <summary>
        /// 將DataTable資料匯入到excel中
        /// </summary>
        /// <param name="data">要匯入的資料</param>
        /// <param name="isColumnWritten">DataTable的列名是否要匯入</param>
        /// <param name="sheetName">要匯入的excel的sheet的名稱</param>
        /// <returns>匯入資料行數(包含列名那一行)</returns>
        public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten)
        {
            int i = 0;
            int j = 0;
            int count = 0;
            ISheet sheet = null;

            fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            if (fileName.IndexOf(".xlsx") > 0) // 2007版本
                workbook = new XSSFWorkbook();
            else if (fileName.IndexOf(".xls") > 0) // 2003版本
                workbook = new HSSFWorkbook();

            try
            {
                if (workbook != null)
                {
                    sheet = workbook.CreateSheet(sheetName);
                }
                else
                {
                    return -1;
                }

                if (isColumnWritten == true) //寫入DataTable的列名
                {
                    IRow row = sheet.CreateRow(0);
                    for (j = 0; j < data.Columns.Count; ++j)
                    {
                        row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
                    }
                    count = 1;
                }
                else
                {
                    count = 0;
                }

                for (i = 0; i < data.Rows.Count; ++i)
                {
                    IRow row = sheet.CreateRow(count);
                    for (j = 0; j < data.Columns.Count; ++j)
                    {
                        row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
                    }
                    ++count;
                }
                workbook.Write(fs); //寫入到excel
                return count;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return -1;
            }
        }

        /// <summary>
        /// 將excel中的資料匯入到DataTable中
        /// </summary>
        /// <param name="sheetName">excel工作薄sheet的名稱</param>
        /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
        /// <returns>返回的DataTable</returns>
        public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
        {
            ISheet sheet = null;
            DataTable data = new DataTable();
            int startRow = 0;
            try
            {
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                if (fileName.IndexOf(".xlsx") > 0) // 2007版本
                    workbook = new XSSFWorkbook(fs);
                else if (fileName.IndexOf(".xls") > 0) // 2003版本
                    workbook = new HSSFWorkbook(fs);

                if (sheetName != null)
                {
                    sheet = workbook.GetSheet(sheetName);
                    if (sheet == null) //如果沒有找到指定的sheetName對應的sheet,則嘗試獲取第一個sheet
                    {
                        sheet = workbook.GetSheetAt(0);
                    }
                }
                else
                {
                    sheet = workbook.GetSheetAt(0);
                }
                if (sheet != null)
                {
                    IRow firstRow = sheet.GetRow(0);
                    int cellCount = firstRow.LastCellNum; //一行最後一個cell的編號 即總的列數

                    if (isFirstRowColumn)
                    {
                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                        {
                            ICell cell = firstRow.GetCell(i);
                            if (cell != null)
                            {
                                string cellValue = cell.StringCellValue;
                                if (cellValue != null)
                                {
                                    DataColumn column = new DataColumn(cellValue);
                                    data.Columns.Add(column);
                                }
                            }
                        }
                        startRow = sheet.FirstRowNum + 1;
                    }
                    else
                    {
                        startRow = sheet.FirstRowNum;
                    }

                    //最後一列的標號
                    int rowCount = sheet.LastRowNum;
                    for (int i = startRow; i <= rowCount; ++i)
                    {
                        IRow row = sheet.GetRow(i);
                        if (row == null) continue; //沒有資料的行預設是null       
                        
                        DataRow dataRow = data.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                        {
                            if (row.GetCell(j) != null) //同理,沒有資料的單元格都預設是null
                            {
                                //dataRow[j] = row.GetCell(j).ToString();  //19890603會顯示成MIDB(C2,7,6)
                                dataRow[j] = row.GetCell(j).StringCellValue;
                            }
                        }
                        data.Rows.Add(dataRow);
                    }
                }

                return data;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return null;
            }
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    if (fs != null)
                        fs.Close();
                }

                fs = null;
                disposed = true;
            }
        }
    }
}


書籤內容替換封裝:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aspose.Words;
using System.Data;

namespace Utils
{
    public static class AsposeWordReplaceBookMarkContentApi
    {
        public static void BookMarkReplace(Document wordDoc,DocumentBuilder builder, string bookMark, string type, string value)
        {
            var bm = wordDoc.Range.Bookmarks[bookMark];
            if (bm == null)
            {
                return;
            }
            
            
            if (type == "IMG")
            {
                bm.Text = "";
                builder.MoveToBookmark(bookMark);
                var img = builder.InsertImage(@value);
                //img.Width = 300;
                //img.Height = 300;
               <span style="color:#ff0000;">img.Width =ConvertUtil.PixelToPoint(124d); //單位轉換</span>
          img.Height = ConvertUtil.PixelToPoint(134d);
                img.HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment.Center;
            }
            else if (type == "TABLE")
            {
                bm.Text = "";
                builder.MoveToBookmark(bookMark);

                DataTable dt = Utils.JsonDataTableConvert.ToDataTable(value);//json轉datatable

                int rowCount = dt.Rows.Count;
                int columnCount = dt.Columns.Count;

                builder.MoveToBookmark(bookMark);
                builder.StartTable();//開始畫Table            
                builder.ParagraphFormat.Alignment = ParagraphAlignment.Center; // RowAlignment.Center;                

                string str = string.Empty;

                builder.RowFormat.Height = 20;

                //新增列頭
                for (int i = 0; i < columnCount; i++)
                {
                    builder.InsertCell();
                    //Table單元格邊框線樣式
                    builder.CellFormat.Borders.LineStyle = LineStyle.Single;
                    //Table此單元格寬度
                    builder.CellFormat.Width = 600;
                    //此單元格中內容垂直對齊方式
                    builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
                    builder.CellFormat.HorizontalMerge = Aspose.Words.Tables.CellMerge.None;
                    builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
                    //字型大小
                    builder.Font.Size = 10;
                    //是否加粗
                    builder.Bold = true;
                    //向此單元格中新增內容
                    builder.Write(dt.Columns[i].ColumnName);
                }
                builder.EndRow();

                //新增每行資料
                for (int i = 0; i < rowCount; i++)
                {


                    for (int j = 0; j < columnCount; j++)
                    {
                        str = dt.Rows[i][j].ToString();

                        //http://www.cnblogs.com/geovindu/p/4106418.html
                        //http://www.cnblogs.com/wuhuacong/archive/2012/08/30/2662961.html

                        //插入Table單元格
                        builder.InsertCell();

                        //Table單元格邊框線樣式
                        builder.CellFormat.Borders.LineStyle = LineStyle.Single;

                        //Table此單元格寬度 跟隨列頭寬度
                        //builder.CellFormat.Width = 500;

                        //此單元格中內容垂直對齊方式
                        builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;

                        builder.CellFormat.HorizontalMerge = Aspose.Words.Tables.CellMerge.None;
                        builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;

                        //字型大小
                        builder.Font.Size = 10;

                        //是否加粗
                        builder.Bold = false;

                        //向此單元格中新增內容
                        builder.Write(str);

                    }

                    //Table行結束
                    builder.EndRow();

                }
                builder.EndTable();
            }
            else
            {//其他文字,日期等文字
                bm.Text = "";
                builder.MoveToBookmark(bookMark);
                bm.Text [email protected];
            }




        }

    }
}

呼叫:

        private void button2_Click(object sender, EventArgs e)
        {
            Aspose.Words.Document doc = new Aspose.Words.Document("TEMPLATE.DOCX");
            Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);

            //在書籤處插入表格
            Utils.AsposeWordReplaceBookMarkContentApi.BookMarkReplace(doc, builder, "BK002", "TABLE", "[{'Name':'zhangsan','Sex':'Male'},{'Name':'wangwu','Sex':'Female'}]");
            //在書籤處插入圖片
            Utils.AsposeWordReplaceBookMarkContentApi.BookMarkReplace(doc, builder, "BK001", "IMG", "1.PNG");
            //在書籤處插入文字
            Utils.AsposeWordReplaceBookMarkContentApi.BookMarkReplace(doc, builder, "BK003", "TEXT", "  測試文字啊啊涉及到法律框架阿斯蘭開發按時交電費卡拉斯幾發,阿斯頓減肥拉斯加付款阿卡麗交電費卡拉斯發的,看到誰放假啦設計費看,開始搭建費綠卡是否看見快樂健康了阿斯頓發順豐空間看拉丁方.");

            string saveDocFile = "1.DOCX";
            doc.Save(saveDocFile);
           
            if (MessageBox.Show("儲存成功,是否開啟檔案?", "", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
            {
                System.Diagnostics.Process.Start(saveDocFile);
            }
        }


效果:


相關推薦

c#Aspose.Word替換書籤內容簡單封裝

輔助類1  json和datatable互轉:   using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Script.S

c#呼叫Aspose.Word元件操作word 插入文字/圖片/表格 書籤替換套打

由於NPOI暫時沒找到書籤內容替換功能,所以換用Apose.Word元件. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; us

使用Jacob自動替換書籤內容

package ceshi; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.jacob.activeX.ActiveXComponent

c# 用Aspose.word讀寫word表格中某個單元格的用法

一、Aspose.word改寫word表格中某個單元格的值 用Aspose.word來讀寫word文件方便快捷,比c#自帶的讀寫word文件的類庫好用很多,網上很多都是迴圈給單元格賦值,這裡我給出改寫或直接給某個單元格賦值的方法: 1、引用(Aspose.Words.dl

利用C++11實現執行緒task的簡單封裝

#include <functional> #include <thread> #include <type_traits> /*Compile only if 'F' is callable. F maybe function, la

C# 復制Word(復制全部內容、部分內容、頁眉頁腳)

images 來講 打開 object cto wpar -o main 技術 本篇示例將介紹C# 復制Word文檔的方法。根據不同的需要,我們將復制Word文檔分三種情況來講述,具體包括以下幾點: 復制整個Word文檔 復制文檔中的部分內容 復制頁眉或者頁腳 工具使用

aspose.word使用簡單方法 加入特殊符號-https://www.cnblogs.com/louby/p/6456021.html

部落格園 首頁 新隨筆 聯絡 管理 訂閱 隨筆- 190  文章- 0  評論- 10  aspose.word 使用簡單方法   aspose.word使用簡單方法 概念介紹 使用aspose生

.net 使用 Aspose.Words 進行 Word替換操作

之前在工作中,需要實現Word列印功能,並且插入圖片。當時採取的方式則是使用書籤進行操作。首先在word內插入書籤,完成後,存為模板。程式載入該模板,找到書籤,並在指定位置寫入文字即可。 後期維護過程中,發現模板經常需要變更,但是書籤在word中不方便檢視,使用者在編輯wo

ASP.NET C#如何讀取word,寫入word,複製內容到另一個word文件,批量修改檔名

首先要新增COM引用 Microsoft word 11.0 Object Library. 然後新增.NET引用 Microsoft.Office.Interop.Word.dll 下載Aspose.Words引用 Aspose.Words.dll using S

使用poi動態替換word指定文字內容

這兩天專案需要用到動態生成word文件,於是從網上查了各種資料。一種是通過poi來替換word指定內容的。具體java程式碼請百度。我這裡直說我遇到的問題以及解決方案。 問題:指定文字被解析成了多個XWFPRun物件,比如${userName}被解析成了“${” + "us

word vba批量替換檔案內容並批量修改檔名

最近在工作中遇到某一資料夾下的許多檔案,名字和內容有大量需要替換,一個個手工替換很麻煩,於是修改了一段程式碼: Sub 批量更改word要素編號及檔名() '此程式碼為指定資料夾中所有選取的WORD檔案的進行格式設定 Dim MyDialog As FileDialog,

二:C#象、集合、DataTable與Json內容互轉示例;

系列 clas rdquo etime private 什麽 讀書 people 過程 這個過程沒有什麽需要說的,擼個簡單一點的代碼說明下:先定義一個人員類,這個類裏面的屬性有string,int,list,枚舉,這幾個差不多夠了。 public class peop

C#ADO.NET資料庫完成簡單操作

資料庫訪問是程式中應用最普遍的部分。隨著C#和ADO.NET的引入,這種操作變得更簡單。這篇文章將示範四種最基礎的資料庫操作。 ● 讀取資料。其中包括多種資料型別:整型,字串,日期型。 ● 寫資料。如讀資料一樣,我們也需要寫入多種型別的資料。這可以通過SQL語句來完成。

C/C++11 正則表示式替換檔案內容

直接上程式碼,YFile只不過是對fstream的封裝 #include <iostream> #include <string> #include <regex> using namespace std; string R

運用c# Word進行操作總結(一)建立Word文件

 在醫療管理系統中為儲存患者的體檢和治療記錄,方便以後的醫生或其他人檢視。當把資料儲存到資料庫中,需要新建很多的欄位,而且操作很繁瑣,於是想到網頁的資訊建立到一個word文字中,在顯示的時,可以線上開啟word,也可以把word轉換成html標籤顯示。 這樣使用

C# Aspose.Word 操作word文件【二】

上一篇我們介紹了用書籤的方式來填充word中資料,今天介紹第二種方法操作word! 依舊是先自己建好word模板,然後這裡就不需要插入書籤了。 1、建立模板 能看到紅色標示的區域依舊用到了書籤,沒事

python txt中每行內容進行批量替換

f = open('./val.txt') lines = f.readlines() #整行讀取 f.close() for line in lines:     rs = line.rstrip('\n') #去除原來每行後面的換行符,但有可能是\r或\r\n     newname=rs.replace

Aspose.Word之通過模板(書籤)匯出word文件,並刪除多餘的單元格

    public partial class WordExport_KJYJJRHLTHTS : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)   

c++11下新增字元編碼格式轉換函式的簡單封裝

c++11標準新增了一些字串編碼格式轉換的函式和類,方便開發者寫跨平臺程式碼。我對它們做了簡單的封裝並在VS2013測試通過。 #pragma once #include <cstdlib> #include <cassert> #include &

設計模式的總結之簡單工廠與策略模式

mage 建立 不變 href catch nag 實現類 初步 cti 前言 面向對象編程追求的本質-提高擴展性、可維護性、靈活性和復用性。合理利用面向對象6個原則,能夠很好的達到要求。如何利用好就是至關重要的了,前人總結了23+個設計模式能夠讓初學者更容易