读取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:
它不需要安装excel,可以使用.net 2.0及以上版本。 它的文档不完整,但你可以在这里search它的Java等价物(它有相同的类和方法):
如果你知道你将安装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 )。