【问题标题】:Reading cell with Long strings from excel C#从excel C#中读取带有长字符串的单元格
【发布时间】:2018-12-21 07:35:59
【问题描述】:

我正在尝试在 datatable() 中加载带有长数据字符串的 excel 文件 这是来自excel的示例数据:

当将此数据加载到数据表中时,我看到它从拨号代码中加载了几个数字,而不是加载完整的数据。

这是我编写的示例代码:

        string sheetName = null;

        using (OleDbConnection connection = new OleDbConnection(connString))
        {
            connection.Open();
            sheetName = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)?.Rows[0]["TABLE_NAME"].ToString();
            string selectCmd = String.Format("select * from [{0}]", sheetName);
            using (OleDbCommand command = new OleDbCommand(selectCmd, connection))
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
            {
                adapter.Fill(fileData);
            }
        }

这是数据可视化工具的屏幕截图:

看看它加载了几个拨号代码而不是全部。

请谁能指导我这段代码有什么问题?还是我使用的数据类型有什么问题?

提前致谢!

【问题讨论】:

  • 列的类型是什么?相关:stackoverflow.com/questions/29408980/…
  • excel中的列类型可以是Text/General。
  • 我几乎可以肯定,所有数据都已正确存储在您的数据表中,但可视化工具并没有显示所有...在 VS 的情况下是正常的。读取此单元格值并将其保存到文本文件中或将其读取到字符串变量并在多行文本框中可视化。
  • @MaciejS。我必须将这些数据读入数据表,然后要求分离拨号代码并在 excel 中生成新行。我已经尝试过了,但它只填充了它在 Visualizer 中显示的内容。

标签: c# excel datatable


【解决方案1】:

我无法使用 oledb 读取值。但是我从nuget安装了EPPLUS。在我读完所有值之后

using (var package = new ExcelPackage(new FileInfo(@"C: \Users\Emre Asus\Desktop\LongExcelDataRead-master\NoRatesFinalPL.xlsx")))
        {
           ExcelWorksheet workSheet = package.Workbook.Worksheets[1];

            for (int i = 1; i < workSheet.Dimension.End.Row ; i++)
            {
                string value = workSheet.Cells[i, 2].Value.ToString();
            }

        } 

【讨论】:

  • 我很欣赏你的努力,但它有更多的静态值,就像你有硬编码的单元格workSheet.Cells[i, 2].Value.ToString();
  • 最初我尝试使用 Datatable 和 oledb 获取 excel 行,但无法获取长字符串数据的全文,因此最终使用 EPPlus 及以上代码有所帮助。
【解决方案2】:

这是我找到的解决方案:

public static DataTable GetDataTableFromExcel(string path, bool hasHeader = true)
    {
        using (var pck = new OfficeOpenXml.ExcelPackage())
        {
            using (var stream = File.OpenRead(path))
            {
                pck.Load(stream);
            }
            var ws = pck.Workbook.Worksheets.First();
            DataTable tbl = new DataTable();
            foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
            {
                tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
            }
            var startRow = hasHeader ? 2 : 1;
            for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
            {
                var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                DataRow row = tbl.Rows.Add();
                foreach (var cell in wsRow)
                {
                    row[cell.Start.Column - 1] = cell.Text;
                }
            }
            return tbl;
        }
    }

@Emre 感谢您的努力,您已将我指向 EPPLUS 并使用 EP plus 我已成功实施该解决方案。

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多