【问题标题】:Read excel file in c#在c#中读取excel文件
【发布时间】:2025-12-28 23:30:16
【问题描述】:

我有一个 excel 文件。我想得到这方面的数据。

我使用这个代码。

public static DataTable ConvertToDataTable(ExcelDocument source, bool hasTitle = true)
{
    if (source == null)
        return null;
    // Get range of used data in excel file.
    Excel.Range excelCell = source.WorkSheet.UsedRange;

    // Get data of range and save it to array.
    Object[,] valuesExcel = (Object[,])excelCell.Value2;
    if (valuesExcel == null)
        return null;
    DataTable dataTable = new DataTable();
    DataRow dataRow;

    // We may have two rows,first for datatable's name and second for datatable's header.
    // We check first(datatable's name) is exist.
    int startRow = (hasTitle) ? 2 : 1;

    int rowIndex;
    int columnIndex;
    int rowsCount;
    int columnsCount;

    // Get count of rows.
    rowsCount = valuesExcel.GetLength(0);

    if (rowsCount != 0)
    {
        // Get count of columns.
        columnsCount = valuesExcel.GetLength(1);
        if (columnsCount != 0)
        {
            for (columnIndex = 1; columnIndex <= columnsCount; columnIndex++)
            {
                // Create column headrs.
                dataTable.Columns.Add(new DataColumn((String)valuesExcel[startRow, columnIndex]));
            }
            columnsCount = dataTable.Columns.Count;
            for (rowIndex = 3; rowIndex <= rowsCount; rowIndex++)
            {
                // Create new row ,fill it and set cells.
                dataRow = dataTable.NewRow();
                for (columnIndex = 1; columnIndex <= columnsCount; columnIndex++)
                {
                    // set data for any cells.
                    dataRow[(String)valuesExcel[startRow, columnIndex]] = valuesExcel[rowIndex, columnIndex];
                }
                dataTable.Rows.Add(dataRow);
            }
        }
    }
    return dataTable;

}

但是rowsCount = valuesExcel.GetLength(0);columnsCount = valuesExcel.GetLength(1); 得到空列和行。

例如,我有一个记录 13 行和 6 列的文件。但是当我使用此代码时,我得到一个 rowcount=34 和 columncount=20。

我的文件中的行和列都是空的。

【问题讨论】:

    标签: c# excel


    【解决方案1】:

    您的 Excel 文件未经过清理。因为您使用的是UsedRange,所以您得到的单元格中曾经有数据。

    你有两个选择:

    1. 通过打开 Excel 文件并实际删除列和行来修复它。仅仅删除单元格内容是行不通的——它只会使其空白。选择您的行和列并实际删除它们。

    2. 在代码中添加逻辑以尝试检测是否应忽略行或列。

    【讨论】:

    • 谢谢,用户选择文件,所以我不使用 1 个选项。我应该检查每一行吗?
    • @Niloo 你不需要检查每一行,但你可以;只需要确定您是否期望每一行和每一列都有数据。你也可以看看 Milos 的回答。
    【解决方案2】:

    嗯,

    我一直需要从 excel 获取数据到我的 dbs,到目前为止,最令人满意的解决方案是 CodePlex 的 Excel 数据阅读器。我的代码片段:

    FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read);
    Excel.ExcelBinaryReader reader = Excel.ExcelReaderFactory.CreateBinaryReader(fs) as Excel.ExcelBinaryReader;
    reader.IsFirstRowAsColumnNames = true;
    
    DataSet ds = reader.AsDataSet();
    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        ;
    }
    

    它还可以通过读取xmls excel文件格式

    CreateOpenXmlReader() method.
    

    完美运行。

    你应该检查一下。

    【讨论】: