我做類似的東西,衝進與來自SQL Server的VARCHAR(max)數據類型相同的錯誤。數據來自哪裏並不重要。從數據庫獲取數據時,需要爲列數據類型和大小定義模式。我通過調用FillSchema的數據適配器上做到這一點,我使用 -
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
da.FillSchema(dt, SchemaType.Source);
return dt;
你也可以單獨設置列屬性,如果你想。
然後我遍歷我的DataTable,並建立了我的列每列出口使用ADOX.NET OLEDB。您不必使用ADOX.NET,這裏的主要概念是使用來自原始數據庫的大小。
foreach (DataColumn col in dt.Columns)
{
columnList.Append(dt.TableName + "." + col.ColumnName + ", ");
ADOX.Column adoxCol = new Column();
adoxCol.ParentCatalog = cat;
adoxCol.Name = col.ColumnName;
adoxCol.Type = TranslateType(col.DataType, col.MaxLength);
int size = col.MaxLength > 0 ? col.MaxLength : 0;
if (col.AllowDBNull)
{
adoxCol.Attributes = ColumnAttributesEnum.adColNullable;
}
adoxTable.Columns.Append(adoxCol, adoxCol.Type, size);
}
這是我的TranslateType方法的代碼片斷,它決定了是否使用LongVarWChar或VarWChar。這些數據類型是oleDB數據類型的ADOX.NET版本。我相信任何超過4000個字符都應該使用LongVarWChar類型,但我不確定這一點。你沒有提及哪個版本的Excel是你的目標,但我這個用Excel 2003工作都和Excel 2007
case "System.String":
if (maxLength > 4000)
{
return DataTypeEnum.adLongVarWChar;
}
return DataTypeEnum.adVarWChar;
的LongVarWChar可以採用大尺寸,可器。--- 2 GB。所以不要擔心尺寸太大。