如何在没有安装Microsoft Office的情况下阅读,编辑和导出WPF中的Word文档?

时间:2015-01-07 11:16:49

标签: wpf ms-word

我有一个WPF应用程序,它严重依赖于操作文档;我想知道是否有一个独立于Microsoft Office Word工作的库,它提供以下功能:

  • 阅读word文档(* .doc或rtf将是满足的,* .docx将是完美的)
  • 允许我从WPF应用程序编辑文档
  • 允许我再次将文档导出为其他格式(word,excel,pdf)
  • 免费:)

提前致谢。

3 个答案:

答案 0 :(得分:0)

我会尝试按顺序回答:

希望它有所帮助。

答案 1 :(得分:0)

几年前我遇到过类似的问题。我有Windows表单应用程序,包含大约20个报告和大约100个用户,我需要从应用程序生成Word文档。应用程序安装在服务器上。我的第一次尝试是通过使用Office互操作来完成的,但它导致性能和各种不可预测的异常问题。所以我开始寻找替代品,我很快就使用了OpenXML。

第一个想法是我们的​​团队将使用OpenXML SDK来生成和操作文档。事实证明,学习曲线太陡峭,我们的管理层不愿意支付额外的工作。

所以我们开始寻找替代方案。我们没有找到任何有用的免费库,因此我们尝试了一些商业库(Aspose,Docentric)。 Aspose给出了很好的结果,但它太贵了。 Docentric的许可证更便宜,产品在Word文档生成中表现良好,所以我们最终决定购买它。

需要从模板生成文档

  1. 安装Docentric Toolkit(您可以免费获得30天试用版)
  2. 在VisualStudio项目广告中引用4个Docentric dll,您可以在安装文件夹C:\ Program Files(x86)\ Docentric \ Toolkit \ Bin
  3. 中找到它们
  4. 通过NuGet包包含实体框架如果要将SQL数据库中的数据填充到Word文档中
  5. 准备Word模板,您可以在其中定义布局并包含将在文档生成时填充数据的字段(请参阅联机文档如何执行此操作)。
  6. 准备要与模板合并的数据不需要太多代码。在我的例子中,我从Northwind数据库准备客户“BONAP”的订单。订单包括客户数据,订单详细信息和产品数据。数据模型还包括页眉和页脚数据。

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using Docentric.Word;
        using System.Diagnostics;
    
        namespace WordReporting
        {
            // Report data model
            public class ReportData
            {
                public ReportData()
                { }
    
                public string headerReportTemplatetName { get; set; }
                public string footerDateCreated { get; set; }
                public string footerUserName { get; set; }
                public List<Order> reportDetails { get; set; }
            }
    
    
            // model extensions
    
            public partial class Order
            {
                public decimal TotalAmount { get; set; }
            }
    
            public partial class Order_Detail
            {
                public decimal Amount { get; set; }
            }
    
    
            // Main
            class Program
            {
                static void Main(string[] args)
                {
                    // variable declaration
                    List<Order> orderList = new List<Order>();
                    string templateName = @"c:\temp\Orders_template1.docx";
                    string generatedDocument = @"c:\temp\Orders_result.docx";
    
                    // reading data from database
                    using (var ctx = new NorthwindEntities1())
                    {
                        orderList = ctx.Orders
                            .Include("Customer")
                            .Include("Order_Details")
                            .Include("Order_Details.Product")
                            .Where(q => q.CustomerID == "BONAP").ToList();
                    }
    
                    // collecting data for the report
                    ReportData repData = new ReportData();
    
                    repData.headerReportTemplatetName = templateName;
                    repData.footerUserName = "<user name comes here>";
                    repData.footerDateCreated = DateTime.Now.ToString();
                    repData.reportDetails = new List<Order>();
    
                    foreach (var o in orderList)
                    {
                        Order tempOrder = new Order();
                        tempOrder.Customer = new Customer();
    
                        tempOrder.OrderID = o.OrderID;
                        tempOrder.Customer.CompanyName = o.Customer.CompanyName;
                        tempOrder.Customer.Address = o.Customer.Address;
                        tempOrder.Customer.City = o.Customer.City;
                        tempOrder.Customer.Country = o.Customer.Country;
                        tempOrder.OrderDate = o.OrderDate;
                        tempOrder.ShippedDate = o.ShippedDate;
    
                        foreach (Order_Detail od in o.Order_Details)
                        {
                            Order_Detail tempOrderDetail = new Order_Detail();
                            tempOrderDetail.Product = new Product();
    
                            tempOrderDetail.OrderID = od.OrderID;
                            tempOrderDetail.ProductID = od.ProductID;
                            tempOrderDetail.Product.ProductName = od.Product.ProductName;
                            tempOrderDetail.UnitPrice = od.UnitPrice;
                            tempOrderDetail.Quantity = od.Quantity;
    
                            tempOrderDetail.Amount = od.UnitPrice * od.Quantity;
                            tempOrder.TotalAmount = tempOrder.TotalAmount + tempOrderDetail.Amount;
    
                            tempOrder.Order_Details.Add(tempOrderDetail);
                        }
    
                        repData.reportDetails.Add(tempOrder);
                    }
    
                    try
                    {
                        // Word document generation
                        DocumentGenerator dg = new DocumentGenerator(repData);
                        DocumentGenerationResult result = dg.GenerateDocument(templateName, generatedDocument);
    
                        // start MS Word and show generated document
                        ProcessStartInfo startInfo = new ProcessStartInfo();
                        startInfo.FileName = "WINWORD.EXE";
                        startInfo.Arguments = "\"" + generatedDocument + "\"";
                        Process.Start(startInfo);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
    
                    // wait for the input to terminate the application
                    Console.WriteLine("Press Enter to exit...");
                    Console.ReadLine();
                    }
                }
            }
        }
    

答案 2 :(得分:-1)

感谢Gemmel,我正在处理大约30个报告(相对很多),这些报告作为word模板存在,我只需要在word文件中填写一些标记的关键词,第一个(可能是明显的方法)是读取这些文件并遍历所有单词,然后用适当的值替换关键字。我发现这不会在复杂的情况下工作,例如我必须生成表格(至少没有很多黑客),所以在尝试了许多对我不起作用的开源解决方案后,我开始寻找另一个aproach,我发现WinForm ReportViewer非常合适,它内置了Word,Excel,PDF和TIF格式的导出功能,它还支持图形,图表,主要详细信息报告等。唯一不方便的是我必须从头开始重新创建30个模板。但我不得不经历这个。它的性能非常可接受,并且易于部署。