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

时间:2013-08-17 09:12:37

标签: c# excel

我注意到在准备我的业务规模时,我意识到这项工作花了很长时间。 excel文件通过Internet从理事会发送给我们,我们计算我们的工作并使用相同的方式发送它们。所以我想自动化准备业务规模。

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

你能帮我解决这个问题吗? 亲切的问候。

7 个答案:

答案 0 :(得分:4)

如果您的应用程序是桌面应用程序(WinForms,WPF),那么您可以使用Interop。它需要在本地安装Excel。但请注意:Interop is not supported in sever-scenarios by MS

如果Excel未在本地安装和/或这是您想要在服务器端执行的操作(如ASP.NET或类似),则有许多选项可以在服务器上没有Interop /安装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.CellsSpreadsheetGearLibXLFlexcel等。

答案 1 :(得分:1)

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

可以找到使用示例herein the project site

就像

一样简单
ws.Cells["B1"].Value = "My Cell Value";

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

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

之类的正则表达式

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

答案 2 :(得分:0)

另一方面,如果您选择将其设为基于Web的应用程序甚至是桌面PHP应用程序,我强烈推荐PHP Excel library,而制作电子表格需要相当多的时间,阅读工作表中的数据是一些简单的代码行,您将看到一个包含所有活动单元格值的数组。它可以处理具有多页甚至公式数据的工作表。

答案 3 :(得分: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。

答案 4 :(得分:0)

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

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

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

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

我给你算法。 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;

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

using Excel = Microsoft.Office.Interop.Excel;

请注意,因为它是COM Interop,您需要保留对此库中对象的每个引用,以便使用Marshal从内存中正确释放它们。这是使用.NET项目中的COM Interop对象的黄金法则。有关详细信息,请在此处阅读:How do I properly clean up Excel interop objects? 所以,这是另一个重要的重要因素:

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库方法下使用的参数({{3} }和Workbooks.Open)。