我正在尝试使用Microsoft.Office.Interop.Excel命名空间打开Excel文件(XSL或CSV,但遗憾的是不是 XSLX)并将其导入DataSet.我无法控制工作表或列名,因此我需要允许对它们进行更改.
我以前尝试过这种OLEDB方法,并且遇到了很多问题(错误,速度慢,并且需要事先了解Excel文件的架构),所以我想避免再次这样做.我想要做的是使用Microsoft.Office.Interop.Excel将工作簿直接导入DataSet,或者循环遍历工作表并将每个工作表加载到DataTable中.
信不信由你,我很难找到资源.在StackOverflow上进行的一些搜索发现大多数人都试图进行反向(DataSet => Excel)或OLEDB技术.谷歌没有多大帮助.
public void Load(string filename, Excel.XlFileFormat format = Excel.XlFileFormat.xlCSV)
{
app = new Excel.Application();
book = app.Workbooks.Open(Filename: filename, Format: format);
DataSet ds = new DataSet();
foreach (Excel.Worksheet sheet in book.Sheets)
{
DataTable dt = new DataTable(sheet.Name);
ds.Tables.Add(dt);
//??? Fill dt from sheet
}
this.Data = ds;
}
Run Code Online (Sandbox Code Playgroud)
我可以一次导入整本书,或者一次循环一张.我可以使用Interop.Excel执行此操作吗?
我在Worksheet.range方法上获得了HRESULT:0x800A03EC.行数超过70K.Office 2007.
码:
Microsoft.Office.Interop.Excel.Range neededRange
= currentWS.Range[cell.Cells[1, 1], cell.Cells[nRowCount, nColumnCount]];
Run Code Online (Sandbox Code Playgroud)
这里我的行数超过65530.打破这个功能.我观察到它只在行数超过65530时才会中断.
我有很多包含数据的excel文件,它包含空行和空列.如下所示
我试图使用互操作从excel中删除空行和列.我创建一个简单的winform应用程序并使用以下代码,它工作正常.
Dim lstFiles As New List(Of String)
lstFiles.AddRange(IO.Directory.GetFiles(m_strFolderPath, "*.xls", IO.SearchOption.AllDirectories))
Dim m_XlApp = New Excel.Application
Dim m_xlWrkbs As Excel.Workbooks = m_XlApp.Workbooks
Dim m_xlWrkb As Excel.Workbook
For Each strFile As String In lstFiles
m_xlWrkb = m_xlWrkbs.Open(strFile)
Dim m_XlWrkSheet As Excel.Worksheet = m_xlWrkb.Worksheets(1)
Dim intRow As Integer = 1
While intRow <= m_XlWrkSheet.UsedRange.Rows.Count
If m_XlApp.WorksheetFunction.CountA(m_XlWrkSheet.Cells(intRow, 1).EntireRow) = 0 Then
m_XlWrkSheet.Cells(intRow, 1).EntireRow.Delete(Excel.XlDeleteShiftDirection.xlShiftUp)
Else
intRow += 1
End If
End While
Dim intCol As Integer = 1
While intCol <= m_XlWrkSheet.UsedRange.Columns.Count
If m_XlApp.WorksheetFunction.CountA(m_XlWrkSheet.Cells(1, …Run Code Online (Sandbox Code Playgroud) 我使用IIS 7.5在Windows 7 64位上运行C#ASP.NET 4.5 Web应用程序.它使用的应用程序池名为"ASP.NET v4.0",其标识为ApplicationPoolIdentity.该应用程序使用MS Office Interop(Microsoft Excel 14.0对象库).
在行wBook = wBooks.Add(Missing.Value);,它会引发以下错误:
由于没有足够的可用内存或磁盘空间,Microsoft Excel无法打开或保存更多文档.
u2022要提供更多可用内存,请关闭不再需要的工作簿或程序.
u2022要释放磁盘空间,请从您要保存的磁盘中删除不再需要的文件:Microsoft.Office.Interop.Excel.Workbooks.Add(Object Template)
1)我在DCOM配置中的MS Excel应用程序上给了帐户IIS apppool\ASP.NET v4.0完全控制.
2)我在'C:\ Windows\SysWOW64\config\systemprofile'上给了IIS apppool\ASP.NET v4.0完全控制,并在其中创建了一个Desktop文件夹.
3)我需要继续使用Interop,虽然不建议这样做.
4)该应用程序在Windows Server 2003/Windows XP 32位上正常工作.
5)计算机上安装了MS Office 2010(64位,试用版).
6)我不想改变应用程序.从ApplicationPoolIdentity到网络服务等的池标识.ApplicationPoolIdentity是IIS 7中新的标识类型,建议使用它.
如果我在DCOM配置中选择"交互式用户"(我已经以管理员身份登录),它可以正常工作,但它会导致其他问题.我需要使用"启动用户",这是ASP.NET v4.0.所以看起来这是一个许可问题.
请帮忙.谢谢.
iis-7 office-interop excel-interop asp.net-4.0 windows-7-x64
我试着按照如何在C#教程中打开Excel文件,即在Com选项卡上添加了一个引用Microsoft Office 14.0 Object Library并尝试编译代码:
using Excel = Microsoft.Office.Interop.Excel;
//...
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
xlApp = new Excel.ApplicationClass();//error here
//...
Run Code Online (Sandbox Code Playgroud)
并且面临编译错误,说
没有为Microsoft.Office.Interop.Excel.ApplicationClass类型定义构造函数.
我错过了什么?
我期待以编程方式从Excel工作表中提取数据并将其插入到数据库表中.
如何确定工作表中的列数和行数或以其他方式迭代行?
我有
Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;
Run Code Online (Sandbox Code Playgroud)
我试过了 worksheet.Range.Rows.Count
哪个扔了
索引属性"Microsoft.Office.Interop.Excel._Worksheet.Range"具有必须提供的非可选参数
需要做什么?
有没有办法通过excel互操作保存对excel电子表格的更改(在这种情况下,我正在向其添加工作表),而不会提示用户是否要用更改覆盖现有文件.我不希望用户甚至在我的应用程序中看到电子表格打开,因此弹出一个消息框询问他们是否要覆盖该文件似乎非常不合适并且可能使用户感到困惑.
我正在使用workbook.SaveAs(fileloaction)方法.
这是我初始化excel互操作的COM引用对象的地方.
private Excel.Application app = null;
private Excel.Workbook workbook = null;
public Excel.Workbook Workbook
{
get { return workbook; }
set { workbook = value; }
}
private Excel.Worksheet worksheet = null;
private Excel.Range workSheet_range = null;
Run Code Online (Sandbox Code Playgroud)
下面是我用来关闭/保存excel文件的代码.workbook.close()方法行是据报道抛出未处理异常的行.
workbook.Close(true, startForm.excelFileLocation, Missing.Value);
Marshal.ReleaseComObject(app);
app = null;
System.GC.Collect();
Run Code Online (Sandbox Code Playgroud) 过滤特定列中的行与EPPlus中的饼一样简单:
private ExcelWorksheet prodUsageWorksheet;
. . .
prodUsageWorksheet.Cells["A6:A6"].AutoFilter = true;
Run Code Online (Sandbox Code Playgroud)
这允许我过滤A列中的行:
我还需要过滤某些列,例如月份列(截图,截至9月15日和10月15日,但通常还有几列).例如,我想用EPPlus以编程方式生成以下内容:
取消选择"全选",选择月份子集,然后单击"确定"按钮将使未选择的一个[s]折叠.
看一些遗留的Excel Interop代码,看起来就像这样:
fld = ((PivotField) pvt.PivotFields("Month"));
fld.Orientation = XlPivotFieldOrientation.xlColumnField;
fld.NumberFormat = "MMM yy";
Run Code Online (Sandbox Code Playgroud)
具体来说,第二个代码块(方向设置为xlColumnField)是体育排序/过滤按钮的列,当操作时,有条件地显示/隐藏各个列.
它是否根据数字格式确定哪些列可显示/可隐藏?也就是说,如果值是"9月15日"或"10月16日"?
我不知道,但我在代码中看不到任何其他更具体设置列过滤限制的内容.
无论如何,如果这是Excel Interop完成它的方式,EPPlus中的等价物是什么?
嗨,我有一个列表容器,其中包含值列表.我希望将列表值直接导出到Excel.有没有办法直接做到这一点?
好的,所以我试图用excel互操作库设置一个单元格的值.我可以用以下内容完成:
sheet.Cells[row, col] = value;
Run Code Online (Sandbox Code Playgroud)
但是我设置的数量非常慢.所以我正试着走这条路:
Range excelRange = sheet.UsedRange;
excelRange.Cells.set_Item(row, col, value);
Run Code Online (Sandbox Code Playgroud)
代码执行,但没有数据放入单元格.关于我缺少什么的任何建议?谢谢!
excel-interop ×10
c# ×9
excel ×7
interop ×2
asp.net-4.0 ×1
dataset ×1
epplus ×1
epplus-4 ×1
excel-2007 ×1
iis-7 ×1
ms-office ×1
optimization ×1
vb.net ×1
vsto ×1