【问题标题】:How to retrieve column names from a excel sheet?如何从 Excel 工作表中检索列名?
【发布时间】:2015-07-01 15:44:20
【问题描述】:

使用EPPlus 我正在将数据写入多个工作表。如果未创建工作表,我将添加工作表,否则我将检索已使用的行并从该行添加数据并保存它

 FileInfo newFile = new FileInfo("Excel.xlsx");
using (ExcelPackage xlPackage = new ExcelPackage(newFile))
{
  var ws = xlPackage.Workbook.Worksheets.FirstOrDefault(x => x.Name == language.Culture);
  if (ws == null)
  {
     worksheet = xlPackage.Workbook.Worksheets.Add(language.Culture);
     //writing data
  }
  else
  {
    worksheet = xlPackage.Workbook.Worksheets[language.Culture];
    colCount = worksheet.Dimension.End.Column;
    rowCount = worksheet.Dimension.End.Row;
    //write data
   }
   worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
   xlPackage.Save();

而且效果很好。

现在我想使用LinqToExcel 检索 excel 中每个工作表的列名,这是我的代码

  string sheetName = language.Culture;
  var excelFile = new ExcelQueryFactory(excelPath);
  IQueryable<Row> excelSheetValues = from workingSheet in            excelFile.Worksheet(sheetName) select workingSheet;
  string[] headerRow = excelFile.GetColumnNames(sheetName).ToArray();

在标题行它给我一个异常

An OleDbException exception was caught
External table is not in the expected format.

但我不想使用 Oledb,而是想使用 Linq To Excel。

注意:当我使用单张而不是多张时 它工作正常并检索所有列。我哪里错了。

【问题讨论】:

  • 如果在从 epplus 导出后但在使用 linq2excel 打开之前打开并保存工作表在 excel 中会发生什么?可能是 epp 只是生成了原始 xml,但在 excel 处理完所有内容之前不会真正生成工作表。
  • 我应该怎么做才能获得所有列名@Ernie
  • 这能解决问题吗?无论哪种方式都很好知道。如果是这样,可能没有实际的解决方案。您可以使用 EPPlus 而不是 Ole 来重新打开 excel 文件吗?
  • 实际上问题的出现是因为列没有正确安装,如果手动排列列宽效果很好,我想知道如何以编程方式进行。我试过worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();@Ernie

标签: linq excel epplus linq-to-excel vba


【解决方案1】:

(基于 OP 的评论)

AutoFitColumn 函数一直有点棘手。要记住的重要一点是在加载单元数据后调用它。

但是,如果您想使用最小宽度(当列非常窄并且您想使用最小宽度时),我发现 EPP 不可靠。即使您将minimumWidth 传递给函数重载之一,它似乎总是使用工作表的DefualtColWidth

这是我解决它的方法:

[TestMethod]
public void Autofit_Column_Range_Test()
{
    //http://stackoverflow.com/questions/31165959/how-to-retrieve-column-names-from-a-excel-sheet

    //Throw in some data
    var datatable = new DataTable("tblData");
    datatable.Columns.Add(new DataColumn("Nar", typeof(int))); //This would not be autofitted without the workaround since the default width of a new ws, usually 8.43
    datatable.Columns.Add(new DataColumn("Wide Column", typeof(int)));
    datatable.Columns.Add(new DataColumn("Really Wide Column", typeof(int)));

    for (var i = 0; i < 20; i++)
    {
        var row = datatable.NewRow();
        row[0] = i;
        row[1] = i * 10;
        row[2] = i * 100;
        datatable.Rows.Add(row);
    }

    var existingFile2 = new FileInfo(@"c:\temp\temp.xlsx");
    if (existingFile2.Exists)
        existingFile2.Delete();

    using (var package = new ExcelPackage(existingFile2))
    {
        //Add the data
        var ws = package.Workbook.Worksheets.Add("Sheet1");
        ws.Cells.LoadFromDataTable(datatable, true);

        //Keep track of the original default of 8.43 (excel default unless the user has changed it in their local Excel install)
        var orginaldefault = ws.DefaultColWidth;
        ws.DefaultColWidth = 15;

        //Even if you pass in a miniumWidth as the first parameter like '.AutoFitColumns(15)' EPPlus usually ignores it and goes with DefaultColWidth
        ws.Cells[ws.Dimension.Address].AutoFitColumns();

        //Set it back to what it was so it respects the user's local setting
        ws.DefaultColWidth = orginaldefault;

        package.Save();
    }
}

【讨论】:

  • 您好,抱歉回复晚了!如果我按照你提到的那样做,它会给我一个异常@Ernie
  • @Ajay 有什么异常和哪一行?如果您可以通过编辑上面的问题来粘贴所有代码,则最好。
  • 我的意思是说读取值时会出现同样的异常,如果我什至这样做@Ernie
  • @AjayA 如果您尝试使用 Linq2Excel 读取 EPPlus 生成的文件,我怀疑它会起作用。由于 EPPlus 不会生成完全执行的 XLSX(只需完成该 excel 的原始 xml),Linq2Excel 一定无法读取它。如果您可以使用一种技术或另一种技术完成所有操作,则最好。
  • 我必须做一些操作。我认为 Linq2Excel 是最好的方法@Ernie
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
相关资源
最近更新 更多