从Excel导入:某些细胞变得无效

问题描述:

我从一个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:

12 
14 
15 
11 

4 
2 

任何想法?

+0

你的一些代码被切断了吗?我没有'1.Text'和'2.Text'。 – devuxer 2011-05-23 03:29:16

+0

@DanM是我编辑它,谢谢。 – 2011-05-23 03:35:28

+0

您是否可以编辑您的Excel文件,请尝试在19k/yr之前放置一个撇号(')。 – devuxer 2011-05-23 03:39:59

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

编辑 - 备选:使用Excel互操作/ 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()); 
    } 
} 
+0

谢谢队友。但有另一种方法吗?因为我导入了接近一百个excel文件,编辑它们都很繁琐 – 2011-05-23 05:20:27

+0

另一种可能性是使用Excel interop。如果您正在安装Office的计算机上工作,这将仅适用,但如果这样做,它将提供比OLEDB更多的灵活性。我会用一些示例代码更新我的答案。 – devuxer 2011-05-23 05:40:47

@Pod梅斯 相反,您可以使用第三方DLL与Excel进行许多操作,并且使用它很容易。 Here is the link to its download :

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

我也推荐它,因为它工作得很好,它也没有给我任何问题。