使用VSTO获取excel列的Default数据类型

时间:2010-04-20 06:16:52

标签: c# excel vsto types

有没有办法使用VSTO c#将excel分配的默认数据类型添加到其列中。

4 个答案:

答案 0 :(得分:4)

您无法测试整个列的数据类型,因为Excel不会将列中所有单元格的数据类型限制为相同。您必须测试单个单元格中保存的数据类型。

只要单元格不为空,您就可以通过对单元格所持有的值调用Object.GetType()方法来测试单元格所持有的数据类型:

// Using C# 4.0
Type type = worksheet.Cells[1,1].Value.GetType();

使用C#3.0会有点麻烦:

// Using C# 3.0
Type type = (worksheet.Cells[1, 1] as Excel.Range).get_Value(Type.Missing).GetType();

但是,如果单元格可能为空,则必须对其进行测试,因为空单元格返回的Range.Valuenull,您无法调用Object.GetType()null。因此,您必须明确地测试null

// Testing Cell Data Type via C# 4.0    
object value = worksheet.Cells[1,1].Value;    
string typeName;

if (value == null)
{
    typeName = "null";
}
else
{
    typeName = value.GetType().ToString();
}

MessageBox.Show("The value held by the cell is a '" + typeName + "'");

如果使用C#3.0,代码类似:

// Testing Cell Data Type via C# 3.0
object value = (worksheet.Cells[1, 1] as Excel.Range).get_Value(Type.Missing);
string typeName;

if (value == null)
{
    typeName = "null";
}
else
{
    typeName = value.GetType().ToString();
}

MessageBox.Show("The value held by the cell is a '" + typeName + "'");

希望这会有所帮助......

- 迈克

答案 1 :(得分:2)

创建 ADO.NET DataTable,SqlConnection和SqlDataAdapter。
使用Excel工作表中的数据填充DataTable 然后使用 DataTable->列[列号] - > DataType 属性从数据表中获取基础数据类型。

以下代码可以帮助您更好地理解。但是它可能不完整。

DataTable dtSourceData = new DataTable(); //ADO.NET
string Con_Str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
  + <Excel file path> + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";";

OleDbConnection con = new OleDbConnection(Con_Str);//ADO.NET
con.Open();

String qry = "SELECT * FROM [Sheet1$]"; 
OleDbDataAdapter odp = new OleDbDataAdapter(qry, con);//ADO.NET
odp.Fill(dtSourceData);

con.Close();

答案 2 :(得分:1)

要获取整列的数据类型,您可以使用以下代码

// Using C# 4.0
for (int i = 0; i <= cells.LastColIndex; i++) //looping all columns of row
  {
     Type type = worksheet.Cells[0,i].Format.FormatType;
  }

上面的代码读取第一行中所有列的数据类型。

但请记住, Excel不会将列中所有单元格的数据类型限制为相同

答案 3 :(得分:0)

Excel中的列和行没有数据类型。 单元格具有依赖于其内容的数据类型(Double,Error,String,Boolean,Empty) 在单元格输入任何内容之前,它是空的。