我有一个WPF应用程序,它严重依赖于操作文档;我想知道是否有一个独立于Microsoft Office Word工作的库,它提供以下功能:
提前致谢。
答案 0 :(得分:0)
我会尝试按顺序回答:
希望它有所帮助。
答案 1 :(得分:0)
第一个想法是我们的团队将使用OpenXML SDK来生成和操作文档。事实证明,学习曲线太陡峭,我们的管理层不愿意支付额外的工作。
所以我们开始寻找替代方案。我们没有找到任何有用的免费库,因此我们尝试了一些商业库(Aspose,Docentric)。 Aspose给出了很好的结果,但它太贵了。 Docentric的许可证更便宜,产品在Word文档生成中表现良好,所以我们最终决定购买它。
需要从模板生成文档
准备要与模板合并的数据不需要太多代码。在我的例子中,我从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个模板。但我不得不经历这个。它的性能非常可接受,并且易于部署。