读取Excel(.xls)模板,用文本框的值replacevariables,并保存在C#中的Excel文件

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

为此,我创build了一个Windows窗体应用程序。 我的应用程序是一个桌面应用程序(WinForms)。 所有数据都写入文本框。 当我们点击确定button时,程序必须读取“template.xls”并用文本框的值replace显示括号“{}”的所有variables。 但我不知道如何读取.xls文件,用值replacevariables并将模板保存为完成文档。 我添加了以下excel文件的截图。 在这里输入图像说明

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

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

如果Excel不是本地安装的,或者这是您想要在服务器端执行的操作(如ASP.NET或类似的),则可以在服务器上不使用Interop /安装Excel的情况下阅读/编辑/创buildExcel文件。

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

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

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

如果您需要处理较旧的Excel版本(如XLS,而不仅仅是XLSX),渲染,创buildPDF,公式等,那么您可能需要更多的免费和商业库,如ClosedXML (免费,仅限XLSX), EPPlus (免费,仅限XLSX) , Aspose.Cells , SpreadsheetGear , LibXL和Flexcel等。

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

用法示例可以在这里和项目站点find 。

它和…一样简单

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

您可以从Excel文件(包含您的括号字段{*}的单元格)读取,根据需要replace它们并保存。

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

它的无缝,因为它使用Open Office格式,那么你不需要安装Excel。

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

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

http://npoi.codeplex.com/

它不需要安装excel,可以使用.net 2.0及以上版本。 它的文档不完整,但你可以在这里search它的Java等价物(它有相同的类和方法):

http://poi.apache.org/

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

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

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

为了阅读xls文档,你可以使用这个代码。 后

你可以在string列表中添加所有的值。
2.你可以使用正则expression式。 例如

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

replaceall(“{”,“”)就是这样。

我给你algorithm。 Umarımyardımcıolmuşturdostum 🙂

 // 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; 

很抱歉听到这个消息,但是你不需要用C#来攻击它。 VB脚本会更好。 但无论哪种方式,我会保持一个单独的映射(如在源字段和Excel单元格的位置)比用标签填充Excel单元格。 保留原来的“模板”是我的宠儿。

对于这个解决scheme,我假设你会在装有Excel的PC上运行它。

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

 using Excel = Microsoft.Office.Interop.Excel; 

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

 using System.Runtime.InteropServices; 

我不知道如何填写此表单,但是我认为括号内的每个数据都有一个字段:{CITY},{NUM_I1}等等。

所以,在你的表单提交中,你可以从你的input中创build一个字典:

 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.Open和Range)下使用的参数。replace )。