EPPLUS使用时出现“工作表位置超出范围。连接已关闭。”错误。

13

我正在尝试使用EPPLUS 4.0.3打开一个XLSX文件作为模板(甚至使用了一个空白的XLSX文件)。

如果我不打开模板文件(即空白或真实文件),只是创建一个新工作簿并创建一个表格,那么它能正常工作。或者如果我打开模板文件并创建一个新的工作表,那么也能正常工作。只有当我尝试访问模板中的第一个表格时,才会出现错误:Worksheet position out of range.

像这样访问第一个表格:workBook.Worksheets.First()无法工作的

First不再是定义。

所以我尝试通过名称和这种方法workBook.Worksheets[1]来访问第一个工作表格,使用0和1都试图获取第一个表格。

我的代码:

    var existingTemplate = new FileInfo(_ExcelTemplateFilePath);
    using (ExcelPackage p = new ExcelPackage(existingTemplate)) {
    // Get the work book in the file
    ExcelWorkbook workBook = p.Workbook;
    ExcelWorksheet ws = workBook.Worksheets[1];
    // MY OTHER EXCEL CELL CODE HERE    
}}

有人知道如何访问Excel文件的第一个工作表吗?

7个回答

15

我通过引用工作表的名称而不是索引,成功解决了这个问题。

var oSheet = package.Workbook.Worksheets["My Worksheet Name"];

7
要获取第一张表格,只需使用以下代码。
    var xlWorkbook = new ExcelPackage(new FileInfo(@"C:\ESD\EXCELDATAREADTEST.xlsx"));

ExcelWorksheet workSheet = xlWorkbook.Workbook.Worksheets[1];

请确保你将工作簿指向正确的位置。


1
我曾遇到同样的问题,问题出在EPPlus无法处理具有命名范围的电子表格。
以下是我使用LibreOffice Calc执行的操作,以便能够读取电子表格:
  1. 创建电子表格的副本
  2. 在LibreOffice中打开
  3. 点击左上角下拉菜单以定义范围。通常读作“A1”
  4. 选择“管理名称”
  5. 突出显示整个列表
  6. 点击“删除”
完成这些步骤后,我保存/关闭了电子表格,并能够使用EPPlus打开它。

1

我使用了

var currentSheet = package.Workbook.Worksheets;
var workSheet = currentSheet.First();

这是因为工作表可能没有已知名称,而现在您对第一个工作表感兴趣。

0

你可以从零开始索引,它也能正常工作。

ExcelWorksheet ws = workBook.Worksheets[0];


0
解决方案:这是因为您没有提供正确的Excel文件路径,而您已经调用或放置在_ExcelTemplateFilePath参数中。 原因:要么您将文件放置在错误的目录中,并且您正在从所需路径调用,但不幸的是没有成功。
  1. 请查看示例,如果您已将Excel文件放置在项目或解决方案的当前目录中(注意:Vs Studio的当前目录始终为\bin\debug.netcoreapp),则可以使用以下代码获取文件: public static FileInfo getfile = new FileInfo(Directory.GetCurrentDirectory() + @"\Login_Credentials.xlsx");
  2. 如果您的Excel文件路径是静态和硬编码的,例如(@"F:\task1 \TestTask\abc.xlsx"),则您的路径必须以给定格式正确,然后才能访问您的文件。

0
问题在于文件类型不符合EPPLUS的要求。它打开xlsx文件,看到工作簿但没有工作表。解决方法是将文件保存为它想要的格式。
  Dim fiOriginal As System.IO.FileInfo
    Dim fiTemp As System.IO.FileInfo
    Dim strOriginalName As String
    Dim strTempName As String

Rem Get a temp name 
    strTempName = IO.Path.GetTempFileName()
    strTempName = strTempName & ".xlsx"

Rem Have EPPLUS save the original as a temp in its format
    fiOriginal = New System.IO.FileInfo(strOriginalName)
    Using pckSrc As New ExcelPackage(fiOriginal)
        pckSrc.SaveAs(fiTemp)
    End Using
    
Rem Process the temp or replace the original and see EPPLUS happy.
    fiOriginal = New System.IO.FileInfo(strTempName)
    Using pckSrc As New ExcelPackage(fiOriginal)
        Dim wBookSrc As ExcelWorkbook = pckSrc.Workbook
        Dim wkShtSrc As ExcelWorksheet = wBookSrc.Worksheets(0)
    
    End Using

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接