从Excel导入:某些单元格变为空

时间:2011-05-23 03:11:23

标签: c# asp.net excel

我正在从excel文件导入数据,我只是注意到导入后某些单元格变为“”

这是我正在使用的代码

                FileUploadExcel.SaveAs("C:\\datatop.xls");
                string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\1.xls;Extended Properties=Excel 8.0;";


                using (OleDbConnection connection = new OleDbConnection(connectionString))
                {
                    connection.Open();
                    OleDbCommand command = new OleDbCommand("Select MONTH, QTY FROM [Sheet1$]", connection);
                    DataTable tb = new DataTable();
                    using (System.Data.Common.DbDataReader dr = command.ExecuteReader())
                    {
                        tb.Load(dr);
                    }
                    gv.DataSource = tb;
                    gv.DataBind();
                }

相关列是QTY,其中包含:

12
14
15
11
19k/yr
4
2

导入后,它将成为gridview上的空间。所有其他单元格在gridview上都显示正常。

GridView中的OUTPUT:

12
14
15
11

4
2

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在Excel中使用OLEDB时,列的数据类型由每列中的前几个项确定。在您的情况下,列中的前几个项是数字,因此它假定列的类型为int。如果希望将列视为文本,则需要确保顶部有一些虚拟行,其中包含确保正确数据类型的数据,然后在将数据读入数据表后过滤掉这些行。我知道这是一个大问题,但它应该有效。

编辑 - 替代方法:使用Excel Interop / COM填充DataTable

using Microsoft.Office.Interop.Excel;
using Sd = System.Data;

private void FillTableData(Sd.DataTable table, Worksheet worksheet, Range cells)
{
    using (var com = new ComObjectManager())
    {
        var firstCell = GetFirstCell(com, cells);
        var beginCell = com.Get<Range>(() => (Range)cells.Item[2, 1]);
        var endCell = GetLastContiguousCell(com, cells, firstCell);
        if (beginCell.Value == null) return;
        var range = GetRange(com, cells, beginCell, endCell);
        var data = (object[,])range.Value;
        var rowCount = data.GetLength(0);
        for (var rowIndex = 0; rowIndex < rowCount; rowIndex++)
        {
            var values = new object[table.Columns.Count];
            for (var columnIndex = 0; columnIndex < table.Columns.Count; columnIndex++)
            {
                var value = data[rowIndex + 1, columnIndex + 1];
                values[columnIndex] = value;
            }
            table.Rows.Add(values);
        }
    }
}

private Range GetFirstCell(ComObjectManager com, Range cells)
{
    return com.Get<Range>(() => (Range)cells.Item[1, 1]);
}

private Range GetLastContiguousCell(ComObjectManager com, Range cells, Range beginCell)
{
    var bottomCell = com.Get<Range>(() => beginCell.End[XlDirection.xlDown]);
    var rightCell = com.Get<Range>(() => beginCell.End[XlDirection.xlToRight]);
    return com.Get<Range>(() => (Range)cells.Item[bottomCell.Row, rightCell.Column]);
}

ComObjectManager - 确保在使用后正确处理COM对象

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public class ComObjectManager : IDisposable
{
    private Stack<object> _comObjects = new Stack<object>();

    public TComObject Get<TComObject>(Func<TComObject> getter)
    {
        var comObject = getter();
        _comObjects.Push(comObject);
        return comObject;
    }

    public void Dispose()
    {
        while (_comObjects.Count > 0)
            Marshal.ReleaseComObject(_comObjects.Pop());
    }
}

答案 1 :(得分:1)

@Pod Mays 相反,你可以使用第三方DLL来处理许多操作的excel,并且很容易使用它。 Here is the link to its download :

通过使用也可以使用的源代码,您可以轻松快速地学习如何使用它。 which is available here :

我也推荐它,因为它非常好用,也没有给我任何问题。