【问题标题】:reading excel from c#, anything new?从 c# 读取 excel,有什么新东西吗?
【发布时间】:2010-11-04 04:16:50
【问题描述】:

我的问题与这里提出的问题非常相似:Reading Excel files from C#

我的问题是现在(2 年后)是否有新的更好的方法来做到这一点,如果没有的话,是否有人有一些使用 ACE OLEDB 12.0 的例子,女巫似乎是最好的方法?

我需要做的是一个应用程序,每天晚上读取一个xlsx文件,将数据包装在excel表中,然后将其保存到数据库中,还有其他提示吗?

谢谢

【问题讨论】:

  • 在这个 SO 问题上查看我的答案 - stackoverflow.com/questions/3812857/…
  • @Mikael:嗨,我真的很喜欢你发布的 codeplex,你经常使用它吗? codeplex 网站上没有太多关于阅读的信息,你知道在剩下行之前是否有类似 read 的方法?非常感谢您阅读 excel 示例,我喜欢您发布的关于 write 的内容。
  • 既然你问得很好,我做了一个例子并将其添加为你问题的答案。基本上我从excelpackage.codeplex.com/… 开始,不得不添加一些东西。一定要给我投票:)

标签: c# .net excel


【解决方案1】:

使用ExcelPackage,您可以像这样迭代所有工作表和列:

public class ExcelRead
{
    public void ReadExcel()
    {
        FileInfo existingFile = new FileInfo(@"C:\temp\book1.xlsx");
        using (ExcelPackage xlPackage = new ExcelPackage(existingFile))
        {
            foreach (ExcelWorksheet worksheet in xlPackage.Workbook.Worksheets)
            {
                var dimension = worksheet.Dimension();
                for (int row = dimension.StartRow; row <= dimension.EndRow; row++)
                {
                    for (int col = dimension.StartColumn; col <= dimension.EndColumn; col++)
                    {
                        Console.WriteLine(row + ":" + col + " - " + worksheet.Cell(row, col));
                    }
                }
            }
        }
    }
}

public class Dimension
{
    public int StartRow { get; set; }
    public int StartColumn { get; set; }
    public int EndRow { get; set; }
    public int EndColumn { get; set; }
}

public static class ExcelHelper
{
    private static readonly char[] _numbers = new[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    public static Dimension Dimension(this ExcelWorksheet worksheet)
    {
        string range =
            worksheet.WorksheetXml.SelectSingleNode("//*[local-name()='dimension']").Attributes["ref"].Value;
        string[] rangeCoordinates = range.Split(':');

        int idx = rangeCoordinates[0].IndexOfAny(_numbers);
        int startRow = int.Parse(rangeCoordinates[0].Substring(idx));
        int startCol = ConvertFromExcelColumnName(rangeCoordinates[0].Substring(0, idx));

        if (rangeCoordinates.Length == 1)
            return new Dimension
                       {StartRow = startRow, StartColumn = startCol, EndRow = startRow, EndColumn = startCol};

        idx = rangeCoordinates[1].IndexOfAny(_numbers);
        int endRow = int.Parse(rangeCoordinates[1].Substring(idx));
        int endCol = ConvertFromExcelColumnName(rangeCoordinates[1].Substring(0, idx));
        return new Dimension {StartRow = startRow, StartColumn = startCol, EndRow = endRow, EndColumn = endCol};
    }

    public static int ConvertFromExcelColumnName(string name)
    {
        name = name.ToUpper();
        int result = 0;
        for (int i = 0; i < name.Length - 1; i++)
        {
            int val = name[i] - 64;
            int columnVal = (int) Math.Pow(26, name.Length - i - 1);
            result += val*columnVal;
        }
        result += name[name.Length - 1] - 64;
        return result;
    }
}

【讨论】:

    【解决方案2】:

    我认为它没有在其他线程中列出。我在 Infragistics 工作,我们有一个用于读写 excel 文件的库。您可以下载试用版here

    【讨论】:

      【解决方案3】:

      我很幸运 EPPlus 可以写入 excel 文件,我认为它也可以很好地读取它们。

      【讨论】:

        【解决方案4】:

        Apache POI 是一个免费的 Java 库,无需安装 Excel 即可访问 MS Office 文档。根据this post,可以使用IKVM.NET 使POI 可用于.NET 程序。

        【讨论】:

          【解决方案5】:

          【讨论】:

            猜你喜欢
            • 2020-08-12
            • 1970-01-01
            • 2017-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多