2

我注意到在准备我的业务规模时,我意识到这项工作花费了太长时间。理事会通过互联网向我们发送一个 excel 文件,我们计算我们的作品并使用相同的方式发送它们。所以我想自动化准备业务规模。

为此,我创建了一个 Windows 窗体应用程序。我的应用程序是桌面应用程序 (WinForms)。所有数据都写入文本框。当我们单击确定按钮时,程序必须读取“template.xls”并将所有显示括号“{}”的变量替换为文本框值。但我不知道如何读取 .xls 文件、用值替换变量并将模板保存为完成的文档。我在下面添加了 excel 文件的屏幕截图。在此处输入图像描述

你能帮我怎么做吗?
亲切的问候。

4

7 回答 7

5

如果您的应用程序是桌面应用程序(WinForms、WPF),那么您可以使用Interop。它需要在本地安装 Excel。但请注意:MS 在服务器场景中不支持互操作

如果 Excel 未在本地安装和/或这是您想要在服务器端执行的操作(如 ASP.NET 或类似),则有许多选项可以读取/编辑/创建 Excel 文件,而无需在服务器上进行互操作/安装 Excel:

MS 提供免费的 OpenXML SDK V 2.0 - 请参阅http://msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx(仅限 XLSX)

这可以读写 MS Office 文件(包括 Excel)。

另一个免费选项参见http://www.codeproject.com/KB/office/OpenXML.aspx(仅限 XLSX)

如果您需要更多处理旧 Excel 版本(如 XLS,不仅是 XLSX)、渲染、创建 PDF、公式等,那么有不同的免费和商业库,如ClosedXML(免费,仅限 XLSX)、EPPlus(免费,仅限 XLSX) , Aspose.Cells , SpreadsheetGear , LibXLFlexcel等。

于 2013-08-19T10:09:41.200 回答
1

EPPlus是一个 .net 库,它使用 Open Office Xml 格式 (xlsx) 读取和写入 Excel 2007/2010 文件。

可以在此处项目站点中找到使用示例。

这很简单

ws.Cells["B1"].Value = "My Cell Value";

您可以从 excel 文件(具有括号字段 {*} 的单元格)中读取,根据需要替换它们并保存。

要检查单元格是否有字段,您可以使用正则表达式,例如Regex.IsMatch(cellValue, "\{.*\}")

它是无缝的,因为它使用 Open Office 格式,所以您不需要安装 Excel。

于 2013-08-19T13:07:59.673 回答
0

Sorry to hear that, but you don't need to attack it using C#. VB Script would have been a better fit. But either way, I would have maintained a separate mapping (as in source fields and excel cell location) than filling the excel cells with tags. It's my pet peeve to preserve the original "template".

于 2013-08-24T17:11:07.343 回答
0

我的公司使用 NPOI。可以在这里找到:

http://npoi.codeplex.com/

它不需要安装 excel,并且可以与 .net 2.0 及更高版本一起使用。它的文档不完整,但您可以在此处搜索它的 java 等价物(它具有相同的类和方法):

http://poi.apache.org/

如果您知道您将安装 excel,您可以尝试使用 oledb

http://www.codeproject.com/Articles/8500/Reading-and-Writing-Excel-using-OLEDB

但我认为它只适用于 xls 而不是 xlsx。

于 2013-08-21T21:48:59.743 回答
0

对于此解决方案,我假设您将在安装了 Excel 的 PC 上运行它。

首先,添加对 library 的引用Microsoft.Office.Interop.Excel。然后,使用它的命名空间:

using Excel = Microsoft.Office.Interop.Excel;

请注意,由于它是 COM 互操作,因此您需要保留对该库中对象的每个引用,以便使用 Marshal 从内存中正确释放它们。这是使用 .NET 项目中的 COM 互操作对象的黄金法则。有关更多信息,请在此处阅读:如何正确清理 Excel 互操作对象? 所以,这是另一个重要的导入:

using System.Runtime.InteropServices;

我不知道您是如何填写此表格的,但我假设括号中的每个数据都有一个字段:{CITY}、{NUM_I1} 等等。

因此,在您的表单提交中,您可以从您的输入中创建一个字典:

Dictionary<string, string> replacing = new Dictionary<string, string>();
replacing.Add("{CITY}",txtCity.Text);
...

然后,填写工作簿:

//Opening Excel Application with desirable template Workbook 
//and instantiating the desirable Worksheet and Range
Excel.Application xlApplication = new Excel.Application();
Excel.Workbooks xlWorkbooks = xlApplication.Workbooks;
Excel.Workbook xlWorkbook = xlWorkbooks.Open(templateFilename, ReadOnly: true);
Excel.Sheets xlSheets = xlWorkbook.Sheets;
Excel.Worksheet xlWorksheet = (Excel.Worksheet)xlSheets[sheetNameOrIndex];
Excel.xlFirstCell = xlWorksheet.Cells[firstRow, firstCol];
Excel.xlLastCell = xlWorksheet.Cells[lastRow, lastCol];
Excel.Range xlRange = xlWorksheet.Cells[xlFirstCell, xlLastCell];

//all of the replacing
foreach (string key in replacing.Keys)
    xlRange.Replace(key, replacing[key]);

//saving
xlWorkbook.SaveAs(newFilename);

//important part: releasing references
Marshal.ReleaseComObject(xlRange);
Marshal.ReleaseComObject(xlFirstCell);
Marshal.ReleaseComObject(xlLastCell);
Marshal.ReleaseComObject(xlWorksheet);
Marshal.ReleaseComObject(xlSheets);
xlWorkbook.Close(SaveChanges: false);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlWorkbooks);
xlApplication.Exit();
Marshal.ReleaseComObject(xlApplication);

我已经使用 c# 4.0. 如果您需要它在不支持可选参数的 Visual Studio 2008 或更早版本下进行开发,您只需将Type.Missing您不想在 Excel 库方法(Workbooks.OpenRange.Replace)下使用的参数传递给它。

于 2013-08-25T18:57:38.750 回答
0

另一方面,如果你选择让它成为一个基于 Web 的应用程序甚至是桌面 PHP 应用程序,我强烈推荐PHP Excel 库,虽然生成电子表格需要相当多的时间,但从工作表中读取数据是几行简单的代码,您就会看到一个包含所有活动单元格值的数组。它可以处理具有多页甚至公式数据的工作表。

于 2013-08-19T12:52:47.990 回答
0

要阅读 xls 文档,您可以使用此代码。后

1.您可以在字符串数组列表中添加所有值。
2.你可以使用正则表达式。例如

如果(a.include(“{”))

replaceall("{","") 那样。

我给你算法。Umarım yardımcı olmuştur dostum :)

// Get the file we are going to process
var existingFile = new FileInfo(filePath);
// Open and read the XlSX file.
using (var package = new ExcelPackage(existingFile))
{
    // Get the work book in the file
    ExcelWorkbook workBook = package.Workbook;
    if (workBook != null)
    {
        if (workBook.Worksheets.Count > 0)
        {
            // Get the first worksheet
            ExcelWorksheet currentWorksheet = workBook.Worksheets.First();

            // read some data
            object col1Header = currentWorksheet.Cells[0, 1].Value;
于 2013-08-23T07:48:53.343 回答