我刚开始通过C#调整Excel,以便能够自动创建,并添加到Excel文件中。
我可以打开文件并更新其数据并浏览现有的工作表。我的问题是如何添加新表?
我试过了:
Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)excelApp.ThisWorkbook.Worksheets.Add(
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
但是我在 COM Exception 之下,我的谷歌搜索没有给我任何答案。
HRESULT的异常:0x800A03EC来源是:“Interop.Excel”
我希望有人能够让我摆脱痛苦。
答案 0 :(得分:42)
您需要在项目中将Microsoft Excel 11.0 Object Library
” - 或任何适合的版本。
此代码适用于我:
private void AddWorksheetToExcelWorkbook(string fullFilename,string worksheetName)
{
Microsoft.Office.Interop.Excel.Application xlApp = null;
Workbook xlWorkbook = null;
Sheets xlSheets = null;
Worksheet xlNewSheet = null;
try {
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
return;
// Uncomment the line below if you want to see what's happening in Excel
// xlApp.Visible = true;
xlWorkbook = xlApp.Workbooks.Open(fullFilename, 0, false, 5, "", "",
false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
xlSheets = xlWorkbook.Sheets as Sheets;
// The first argument below inserts the new worksheet as the first one
xlNewSheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = worksheetName;
xlWorkbook.Save();
xlWorkbook.Close(Type.Missing,Type.Missing,Type.Missing);
xlApp.Quit();
}
finally {
Marshal.ReleaseComObject(xlNewSheet);
Marshal.ReleaseComObject(xlSheets);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlApp);
xlApp = null;
}
}
请注意,您要对properly cleaning up and releasing your COM object references非常小心。 StackOverflow问题中包含一个有用的经验法则:“绝不使用带有COM对象的2个点”。在你的代码中;你会遇到真正的麻烦。 我上面的演示代码没有正确清理Excel应用程序,但这是一个开始!
在查看此问题时,我发现其他一些有用的链接:
根据MSDN
要使用COM互操作,您必须拥有 管理员或高级用户安全性 权限。
希望有所帮助。
答案 1 :(得分:5)
感谢您的一些优秀回复。 @AR。,你的明星,它完美无缺。昨晚我注意到Excel.exe
没有关闭;所以我做了一些研究,发现了如何释放COM对象。这是我的最终代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
using Excel;
namespace testExcelconsoleApp
{
class Program
{
private String fileLoc = @"C:\temp\test.xls";
static void Main(string[] args)
{
Program p = new Program();
p.createExcel();
}
private void createExcel()
{
Excel.Application excelApp = null;
Excel.Workbook workbook = null;
Excel.Sheets sheets = null;
Excel.Worksheet newSheet = null;
try
{
FileInfo file = new FileInfo(fileLoc);
if (file.Exists)
{
excelApp = new Excel.Application();
workbook = excelApp.Workbooks.Open(fileLoc, 0, false, 5, "", "",
false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
sheets = workbook.Sheets;
//check columns exist
foreach (Excel.Worksheet sheet in sheets)
{
Console.WriteLine(sheet.Name);
sheet.Select(Type.Missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
}
newSheet = (Worksheet)sheets.Add(sheets[1], Type.Missing, Type.Missing, Type.Missing);
newSheet.Name = "My New Sheet";
newSheet.Cells[1, 1] = "BOO!";
workbook.Save();
workbook.Close(null, null, null);
excelApp.Quit();
}
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(newSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
newSheet = null;
sheets = null;
workbook = null;
excelApp = null;
GC.Collect();
}
}
}
}
感谢您的帮助。
答案 2 :(得分:2)
AR的另一个“Up Tick”,但如果您不必使用互操作,我会完全避免它。这个产品实际上非常有趣: http://www.clearoffice.com/它为操作excel文件提供了一个非常直观,完全管理的api,似乎是免费的。 (至少在目前)SpreadSheetGear也很优秀但价格昂贵。
我的两分钱。答案 3 :(得分:1)
不要忘记将参考包含在
中Microsoft Excel 12.0/11.0 object Library
using Excel = Microsoft.Office.Interop.Excel;
// Include this Namespace
Microsoft.Office.Interop.Excel.Application xlApp = null;
Excel.Workbook xlWorkbook = null;
Excel.Sheets xlSheets = null;
Excel.Worksheet xlNewSheet = null;
string worksheetName ="Sheet_Name";
object readOnly1 = false;
object isVisible = true;
object missing = System.Reflection.Missing.Value;
try
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
return;
// Uncomment the line below if you want to see what's happening in Excel
// xlApp.Visible = true;
xlWorkbook = xlApp.Workbooks.Open(@"C:\Book1.xls", missing, readOnly1, missing, missing, missing, missing, missing, missing, missing, missing, isVisible, missing, missing, missing);
xlSheets = (Excel.Sheets)xlWorkbook.Sheets;
// The first argument below inserts the new worksheet as the first one
xlNewSheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = worksheetName;
xlWorkbook.Save();
xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
xlApp.Quit();
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
//xlApp = null;
}
答案 4 :(得分:0)
您可以使用OLEDB来创建和操作Excel文件。有关链接和示例,请参阅this question。
答案 5 :(得分:0)
以下是我想到的一些事情:
您无法同时打开同一对象的多个实例。例如,如果您实例化一个名为xlsheet1
的新Excel工作表对象,则必须在创建另一个Excel工作表对象ex xlsheet2
之前将其释放。似乎COM失去了对象的跟踪并在服务器上留下了一个僵尸进程。
如果有多个用户访问同一文件,则使用与excel.workbooks
关联的open方法也很难关闭。使用Add方法,它可以在不锁定文件的情况下工作。例如。 xlBook = xlBooks.Add("C:\location\XlTemplate.xls")
释放COM对象后,将垃圾收集放在单独的块或方法中。
答案 6 :(得分:0)
COM 绝对不是一个好方法。更具体地说,如果你正在处理网络环境,那就不行了......
我成功使用了以下开源项目:
用于OOXML格式的ExcelPackage(Office 2007)
NPOI for .XLS格式(Office 2003)
看一下这些博文:
答案 7 :(得分:0)
这是我以前添加的其他工作表
Workbook workbook = null;
Worksheet worksheet = null;
workbook = app.Workbooks.Add(1);
workbook.Sheets.Add();
Worksheet additionalWorksheet = workbook.ActiveSheet;
答案 8 :(得分:0)
我在VSTO中遇到类似问题的应用程序级外接程序,例如HRESULT:0x800A03EC,在添加新工作表时。
错误代码0x800A03EC(或-2146827284)表示NAME_NOT_FOUND;在 换句话说,你已经要求了一些东西,Excel无法找到它。
Dominic Zukiewicz @ Excel error HRESULT: 0x800A03EC while trying to get range with cell's name
然后我终于意识到 ThisWorkbook 触发了异常。 ActiveWorkbook 就行了。
Excel.Worksheet newSheetException = Globals.ThisAddIn.Application.ThisWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);
Excel.Worksheet newSheetNoException = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);