zoukankan      html  css  js  c++  java
  • Csharp: create word file using Open XML SDK 2.5

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml.Spreadsheet;
    using System.IO;
    using System.IO.Packaging;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace OpenXmlOficeDemo
    {
    
        /// <summary>
        ///Open XML SDK 2.0 WORD https://msdn.microsoft.com/en-us/library/office/gg490656(v=office.14).aspx
        ///Open XML SDK 2.5 WORD https://msdn.microsoft.com/en-us/library/office/ff478541.aspx
        /// </summary>
        public partial class Form2 : Form
        {
    
            /// <summary>
            /// 
            /// </summary>
            public Form2()
            {
                InitializeComponent();
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Form2_Load(object sender, EventArgs e)
            {
    
                //打开文档添加表格
                //string timeMark = DateTime.Now.ToString("yyyyMMddHHmmss");
                //string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "全国民代课教师的信息收集模板" + ".docx");  // "geovindu" + timeMark  
                //WDAddTable(fileName, new string[,] 
                //  { 
                //      { "涂聚文",  "Du" }, 
                //      { "Texas",  "TX" }, 
                //      { "California", "CA" }, 
                //      { "New York", "NY" }, 
                //      { "New York", "NY" }, 
                //      { "Massachusetts", "MA" } 
                //  });
    
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                // Change an existing property's value or create a new one with the supplied value
                WDSetCustomProperty("C:\demo.docx", "Completed",false, PropertyTypes.YesNo);
    
                // Change an existing property's value or create a new one with the supplied value
                WDSetCustomProperty("C:\demo.docx", "Completed",new DateTime(2008, 1, 1), PropertyTypes.DateTime);
    
    
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button2_Click(object sender, EventArgs e)
            {
                string timeMark = DateTime.Now.ToString("yyyyMMddHHmmss");
                string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "geovindu" + timeMark + ".docx");
                CreateWordDoc(fileName, "geovin", new string[,] 
                  { 
                      { "涂聚文",  "Du" }, 
                      { "Texas",  "TX" }, 
                      { "California", "CA" }, 
                      { "New York", "NY" }, 
                      { "New York", "NY" }, 
                      { "Massachusetts", "MA" } 
                  });
    
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public static XElement WDRetrieveTOC(string fileName)
            {
                XElement TOC = null;
    
                using (var document = WordprocessingDocument.Open(fileName, false))
                {
                    var docPart = document.MainDocumentPart;
                    var doc = docPart.Document;
    
                    OpenXmlElement block = doc.Descendants<DocPartGallery>().
                      Where(b => b.Val.HasValue &&
                        (b.Val.Value == "Table of Contents")).FirstOrDefault();
    
                    if (block != null)
                    {
                        // Back up to the enclosing SdtBlock and return that XML.
                        while ((block != null) && (!(block is SdtBlock)))
                        {
                            block = block.Parent;
                        }
                        TOC = new XElement("TOC", block.OuterXml);
                    }
                }
                return TOC;
            }
            /// <summary>
            /// 打开WORD添加表格WORD    
            /// Take the data from a 2-dimensional array and build a table at the 
            /// end of the supplied document.
            /// </summary>
            /// <param name="fileName"></param>
            /// <param name="data"></param>
            public static void WDAddTable(string fileName, string[,] data)
            {
    
    
                using (var document =  WordprocessingDocument.Open(fileName, true))//WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document))
                {
    
                    var doc = document.MainDocumentPart.Document;
    
                    DocumentFormat.OpenXml.Wordprocessing.Table table = new DocumentFormat.OpenXml.Wordprocessing.Table();
    
                    TableProperties props = new TableProperties(
                      new TableBorders(
                        new DocumentFormat.OpenXml.Wordprocessing.TopBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new DocumentFormat.OpenXml.Wordprocessing.BottomBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new DocumentFormat.OpenXml.Wordprocessing.LeftBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new DocumentFormat.OpenXml.Wordprocessing.RightBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new InsideHorizontalBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new InsideVerticalBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        }));
                    table.AppendChild<TableProperties>(props);
    
                    for (var i = 0; i <= data.GetUpperBound(0); i++)
                    {
                        var tr = new TableRow();
                        for (var j = 0; j <= data.GetUpperBound(1); j++)
                        {
                            var tc = new TableCell();
                            tc.Append(new Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Text(data[i, j]))));
                            // Assume you want columns that are automatically sized.
                            tc.Append(new TableCellProperties(
                              new TableCellWidth { Type = TableWidthUnitValues.Auto }));
                            tr.Append(tc);
                        }
                        table.Append(tr);
                    }
                    doc.Body.Append(table);
                    doc.Save();
                }
            }
    
            /// <summary>
            /// 创建WORD文档,添加表格
            /// </summary>
            /// <param name="filepath"></param>
            /// <param name="msg"></param>
            /// <param name="data"></param>
            public static void CreateWordDoc(string filepath, string msg, string[,] data)
            {
                using (WordprocessingDocument doc = WordprocessingDocument.Create(filepath, WordprocessingDocumentType.Document))
                {
                    // Add a main document part. 
                    MainDocumentPart mainPart = doc.AddMainDocumentPart();
                    // Create the document structure and add some text.
                    mainPart.Document = new Document();
                    Body body = new Body(); //
                    DocumentFormat.OpenXml.Wordprocessing.Table table = new DocumentFormat.OpenXml.Wordprocessing.Table();
                    TableProperties props = new TableProperties(
                      new TableBorders(
                        new DocumentFormat.OpenXml.Wordprocessing.TopBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new DocumentFormat.OpenXml.Wordprocessing.BottomBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new DocumentFormat.OpenXml.Wordprocessing.LeftBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new DocumentFormat.OpenXml.Wordprocessing.RightBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new InsideHorizontalBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        },
                        new InsideVerticalBorder
                        {
                            Val = new EnumValue<BorderValues>(BorderValues.Single),
                            Size = 12
                        }));
                    table.AppendChild<TableProperties>(props);
    
                    for (var i = 0; i <= data.GetUpperBound(0); i++)
                    {
                        var tr = new TableRow();
                        for (var j = 0; j <= data.GetUpperBound(1); j++)
                        {
                            var tc = new TableCell();
                            tc.Append(new Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Text(data[i, j]))));
                            // Assume you want columns that are automatically sized.
                            tc.Append(new TableCellProperties(
                              new TableCellWidth { Type = TableWidthUnitValues.Auto }));
                            tr.Append(tc);
                        }
                        table.Append(tr);
                    }
    
                    //appending table to body
                    body.Append(table);
                    // and body to the document
                    mainPart.Document.Append(body);
                    // Save changes to the main document part. 
                    mainPart.Document.Save();
     
                }
           
            }
    
            /// <summary>
            /// Delete headers and footers from a document.
            /// </summary>
            /// <param name="docName"></param>
            public static void WDRemoveHeadersFooters(string docName)
            {
                // Given a document name, remove all headers and footers.
                using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(docName, true))
                {
                    var docPart = wdDoc.MainDocumentPart;
                    if (docPart.HeaderParts.Count() > 0 || docPart.FooterParts.Count() > 0)
                    {
                        // Remove header and footer parts.
                        docPart.DeleteParts(docPart.HeaderParts);
                        docPart.DeleteParts(docPart.FooterParts);
    
                        Document doc = docPart.Document;
    
                        // Remove references to the headers and footers.
                        // This requires digging into the XML content
                        // of the document:
                        var headers =
                          doc.Descendants<HeaderReference>().ToList();
                        foreach (var header in headers)
                        {
                            header.Remove();
                        }
    
                        var footers =
                          doc.Descendants<FooterReference>().ToList();
                        foreach (var footer in footers)
                        {
                            footer.Remove();
                        }
                        doc.Save();
                    }
                }
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="filepath"></param>
            /// <param name="txt"></param>
            public static void OpenAndAddTextToWordDocument(string filepath, string txt)
            {
                // Open a WordprocessingDocument for editing using the filepath.
                WordprocessingDocument wordprocessingDocument =
                    WordprocessingDocument.Open(filepath, true);
    
                // Assign a reference to the existing document body.
                Body body = wordprocessingDocument.MainDocumentPart.Document.Body;
    
                // Add new text.
                Paragraph para = body.AppendChild(new Paragraph());
                DocumentFormat.OpenXml.Wordprocessing.Run run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
                run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(txt));
    
                // Close the handle explicitly.
                wordprocessingDocument.Close();
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="filepath"></param>
            /// <param name="msg"></param>
            public static void CreateWordDoc(string filepath, string msg)
            {
                using (WordprocessingDocument doc = WordprocessingDocument.Create(filepath, WordprocessingDocumentType.Document))
                {
                    // Add a main document part. 
                    MainDocumentPart mainPart = doc.AddMainDocumentPart();
    
                    // Create the document structure and add some text.
                    mainPart.Document = new Document();
                    Body body = mainPart.Document.AppendChild(new Body());
                    Paragraph para = body.AppendChild(new Paragraph());
                    DocumentFormat.OpenXml.Wordprocessing.Run run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
    
                    // String msg contains the text, "Hello, Word!"
                    run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(msg));
                }
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="filepath"></param>
            public static void OpenWordprocessingDocumentReadonly(string filepath)
            {
                // Open a WordprocessingDocument based on a filepath.
                using (WordprocessingDocument wordDocument =
                    WordprocessingDocument.Open(filepath, false))
                {
                    // Assign a reference to the existing document body.  
                    Body body = wordDocument.MainDocumentPart.Document.Body;
    
                    // Attempt to add some text.
                    Paragraph para = body.AppendChild(new Paragraph());
                    DocumentFormat.OpenXml.Wordprocessing.Run run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
                    run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));
    
                    // Call Save to generate an exception and show that access is read-only.
                    // wordDocument.MainDocumentPart.Document.Save();
                }
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="filepath"></param>
            public static void OpenWordprocessingPackageReadonly(string filepath)
            {
                // Open System.IO.Packaging.Package.
                Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read);
    
                // Open a WordprocessingDocument based on a package.
                using (WordprocessingDocument wordDocument =
                    WordprocessingDocument.Open(wordPackage))
                {
                    // Assign a reference to the existing document body. 
                    Body body = wordDocument.MainDocumentPart.Document.Body;
    
                    // Attempt to add some text.
                    Paragraph para = body.AppendChild(new Paragraph());
                    DocumentFormat.OpenXml.Wordprocessing.Run run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
                    run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text("Append text in body, but text is not saved - OpenWordprocessingPackageReadonly"));
    
                    // Call Save to generate an exception and show that access is read-only.
                    // wordDocument.MainDocumentPart.Document.Save();
                }
    
                // Close the package.
                wordPackage.Close();
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="filepath"></param>
            public static void CreateSpreadsheetWorkbook(string filepath)
            {
                // Create a spreadsheet document by supplying the filepath.
                // By default, AutoSave = true, Editable = true, and Type = xlsx.
                SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
    
                // Add a WorkbookPart to the document.
                WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
                workbookpart.Workbook = new Workbook();
    
                // Add a WorksheetPart to the WorkbookPart.
                WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
                worksheetPart.Worksheet = new Worksheet(new SheetData());
    
                // Add Sheets to the Workbook.
                Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
    
                // Append a new worksheet and associate it with the workbook.
                Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" };
                sheets.Append(sheet);
    
                workbookpart.Workbook.Save();
    
                // Close the document.
                spreadsheetDocument.Close();
            }
    

      

    /// <summary>
            /// 
            /// </summary>
            /// <param name="sourceFile"></param>
            /// <param name="destinationFile"></param>
            private void setWord(string sourceFile, string destinationFile)
            {
                File.Copy(sourceFile, destinationFile, true);
                using (WordprocessingDocument document = WordprocessingDocument.Open(destinationFile, true))
                {
                    // Change the document type to Document  DocumentFormat.OpenXml.WordprocessingDocumentType
    
                   // DocumentFormat.OpenXml.WordprocessingDocumentType doc = new WordprocessingDocumentType();  
                     document.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
                    // Get the MainPart of the document
                    MainDocumentPart mainPart = document.MainDocumentPart;
                    // Get the Document Settings Part
                    DocumentSettingsPart documentSettingPart1 = mainPart.DocumentSettingsPart;
                    // Create a new attachedTemplate and specify a relationship ID
                    AttachedTemplate attachedTemplate1 = new AttachedTemplate() { Id = "relationId1" };
                    // Append the attached template to the DocumentSettingsPart
                    documentSettingPart1.Settings.Append(attachedTemplate1);
                    // Add an ExternalRelationShip of type AttachedTemplate.
                    // Specify the path of template and the relationship
                    documentSettingPart1.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate", new Uri(sourceFile, UriKind.Absolute), "relationId1");
    
                    // Get a list of bookmarks
                    IDictionary<String, BookmarkStart> bookmarkMap = new Dictionary<String, BookmarkStart>();
                    foreach (BookmarkStart bookmarkStart in mainPart.RootElement.Descendants<BookmarkStart>())
                    {
                        bookmarkMap[bookmarkStart.Name] = bookmarkStart;
                    }
                    // Make changes to bookmarks
                    foreach (BookmarkStart bookmarkStart in bookmarkMap.Values)
                    {
                        if (bookmarkStart.Name == "WorkOrderNo")
                        {
                            string WorkOrderNum = "WorkOrderNo";
                            DocumentFormat.OpenXml.Wordprocessing.Text text = new DocumentFormat.OpenXml.Wordprocessing.Text(WorkOrderNum);
                            DocumentFormat.OpenXml.Wordprocessing.FontSize WOFontSize = new DocumentFormat.OpenXml.Wordprocessing.FontSize();
                            WOFontSize.Val = "28";
                            DocumentFormat.OpenXml.Wordprocessing.Run run = new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.RunProperties(new DocumentFormat.OpenXml.Wordprocessing.Bold(), WOFontSize));
                            run.Append(text);
                            bookmarkStart.InsertAfterSelf(run);
                        }
                        else if (bookmarkStart.Name == "BillingCode")
                        {
                            string BillingCode = "BillingCode";
                            DocumentFormat.OpenXml.Wordprocessing.Text text = new DocumentFormat.OpenXml.Wordprocessing.Text(BillingCode);
                            DocumentFormat.OpenXml.Wordprocessing.FontSize WOFontSize = new DocumentFormat.OpenXml.Wordprocessing.FontSize();
                            WOFontSize.Val = "28";
                            DocumentFormat.OpenXml.Wordprocessing.Run run = new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.RunProperties(new DocumentFormat.OpenXml.Wordprocessing.Bold(), WOFontSize));
                            run.Append(text);
                            bookmarkStart.InsertAfterSelf(run);
                        }
                    }
                    // Save the document
                    mainPart.Document.Save();
                }
            }
            /// <summary>
            /// To search and replace content in a document part.
            /// </summary>
            /// <param name="document"></param>
            /// <param name="dict"></param>
            public static void SearchAndReplace(string document, Dictionary<string, string> dict)
            {
                using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
                {
                    string docText = null;
                    using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
                    {
                        docText = sr.ReadToEnd();
                    }
    
                    foreach (KeyValuePair<string, string> item in dict)
                    {
                        Regex regexText = new Regex(item.Key);
                        docText = regexText.Replace(docText, item.Value);
                    }
    
                    using (StreamWriter sw = new StreamWriter(
                              wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
                    {
                        sw.Write(docText);
                    }
    
                }
            }
    

      

  • 相关阅读:
    【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫 2014-05-23 14:07 515人阅读 评论(0) 收藏
    【搜索引擎基础知识3】搜索引擎相关开源项目及网站 2014-05-23 11:44 757人阅读 评论(0) 收藏
    HtmlParser基础教程 分类: C_OHTERS 2014-05-22 11:33 1649人阅读 评论(1) 收藏
    【搜索引擎Jediael开发4】V0.01完整代码 分类: H_HISTORY 2014-05-21 21:35 470人阅读 评论(0) 收藏
    学习金字塔 分类: T_TALENT 2014-05-21 09:25 331人阅读 评论(0) 收藏
    【搜索引擎Jediael开发笔记3】使用HtmlParser提取网页中的链接 分类: H3_NUTCH 2014-05-20 20:50 1211人阅读 评论(0) 收藏
    Java解析HTML之HTMLParser使用与详解 分类: C_OHTERS 2014-05-19 21:46 2309人阅读 评论(0) 收藏
    【搜索引擎Jediael开发笔记2】使用HttpClient下载网页至本地文件 分类: C_OHTERS 2014-05-19 15:07 1108人阅读 评论(0) 收藏
    HttpClient基础教程 分类: C_OHTERS 2014-05-18 23:23 2600人阅读 评论(0) 收藏
    【搜索引擎基础知识2】网络爬虫的介绍 2014-05-16 14:10 395人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/geovindu/p/4748350.html
Copyright © 2011-2022 走看看