C# 读取excel(.xls)模板,用文本框值替换变量,并用C保存excel文件#

C# 读取excel(.xls)模板,用文本框值替换变量,并用C保存excel文件#,c#,excel,C#,Excel,我注意到,在为我的业务规模做准备时,我意识到我花在这项工作上的时间太长了。一个excel文件通过互联网从委员会发送给我们,我们计算我们的作品并用同样的方式发送。所以我想自动化准备业务规模 为此,我创建了一个windows窗体应用程序我的应用程序是桌面应用程序(WinForms)。所有数据都写入文本框。当我们点击OK按钮时,程序必须读取“template.xls”,并用文本框值替换所有显示括号“{}”的变量。但我不知道如何读取.xls文件,用值替换变量,并将模板保存为完成的文档。我在下面添加了ex

我注意到,在为我的业务规模做准备时,我意识到我花在这项工作上的时间太长了。一个excel文件通过互联网从委员会发送给我们,我们计算我们的作品并用同样的方式发送。所以我想自动化准备业务规模

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

你能帮我怎么做吗?

问候。

如果您的应用程序是桌面应用程序(WinForms,WPF),那么您可以使用。它需要本地安装Excel。但请注意:

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

MS提供免费的OpenXMLSDK2.0-请参阅(仅限XLSX)

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

另一个免费选项请参见(仅限XLSX)


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

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

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

可以找到和查看使用示例

这很简单

ws.Cells["B1"].Value = "My Cell Value";
您可以读取excel文件(包含括号字段{*}的单元格),根据需要替换它们并保存

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


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

我的公司使用NPOI。可在此处找到:

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

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


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

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

1.您可以在字符串arraylist中添加所有值。
2.你可以使用正则表达式。比如说

如果(a.包括(“{”))

像那样替换所有(“{,”)

我给你一个算法。乌马尔•米•码•麦克•奥尔姆•图尔•多斯塔姆:)


很抱歉听到这个消息,但是你不需要用C#来攻击它。VB脚本会更合适。但不管怎样,我都会维护一个单独的映射(如在源字段和excel单元格位置中),而不是用标记填充excel单元格。保留原始“模板”是我的心病.

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

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

using Excel = Microsoft.Office.Interop.Excel;
请注意,由于它是COM互操作,您需要保留对此库中对象的每个引用,以便使用封送从内存中正确释放它们。这是使用.NET项目中的COM互操作对象的黄金法则。有关详细信息,请阅读此处: 因此,这是另一个重要的意义:

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

因此,在表单提交中,您可以根据输入创建字典:

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

我是用c#4.0制作的。如果您需要在Visual Studio 2008或更高版本下开发它,而Visual Studio 2008或更高版本不支持可选参数,您只需将
Type.Missing
传递给您不想在Excel库方法下使用的参数(和).

也许这会有帮助:如果你的文本只需要插入特定的单元格,而不需要在公式或宏方面与工作表交互,我建议使用模板构建工作表,而不是尝试更新现有的模板。谢谢你的评论,但我是C#初学者。所以我不知道该怎么做。我不想等待2天的赏金。项目被阻塞。如果{name}是简单文本,您可以尝试将整个文件读取为字符串和调用字符串。替换文本并将其另存为xls文件。但您必须使用新的xlsx格式,该格式是与文本文档一起压缩的文件。将模板另存为xlst并将其重命名为.zip并查看其内容。然后,您可以使用SharpZip库提取文本、替换并创建zip并另存为xlsx
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);