我注意到在准备我的业务规模时,我意识到这项工作花了很长时间。 excel文件通过Internet从理事会发送给我们,我们计算我们的工作并使用相同的方式发送它们。所以我想自动化准备业务规模。
为此,我创建了一个Windows窗体应用程序。 我的应用程序是桌面应用程序(WinForms)。所有数据都写入文本框。当我们单击“确定”按钮时,程序必须读取“template.xls”并将所有显示括号“{}”的变量替换为文本框值。但我不知道如何阅读.xls文件,用值替换变量并将模板保存为完成的文档。我在下面添加了excel文件的屏幕截图。
你能帮我解决这个问题吗? 亲切的问候。
答案 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.Cells,SpreadsheetGear,LibXL和Flexcel等。
答案 1 :(得分:1)
EPPlus是一个.net库,使用Open Office Xml格式(xlsx)读取和写入Excel 2007/2010文件。
可以找到使用示例here和in 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。可以在这里找到:
它不需要安装excel,可以使用.net 2.0及更高版本。它的文档不完整,但你可以在这里搜索它的java等价物(它有相同的类和方法):
如果您知道安装了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)。