SSIS 和 Excel 文件传奇
SSIS and The Excel Files Saga
我有一个 Excel 文件 (xls),其中有一个名为 Money 的列。在 Money 列中,所有列都被格式化为数字,除了一些具有针对它们的标记语句格式化为文本的列。我使用 c# 脚本将 Excel 文件转换为 CSV,该脚本在连接字符串中使用 IMEX=1 来打开它。标记为存储为文本的字段不会进入 csv 文件。文件很大,大约20MB。所以这意味着 33344 等 100 个值不会通过 csv 文件。
我试图延迟打开 Excel 文件的位置。这在我的电脑上有效,但在开发机器上无效。
知道如何在不手动干预的情况下解决这个问题,比如将所有具有混合数据类型的列格式化为数字等吗?我正在寻找一种每次都有效的自动化解决方案。这是在 SSIS 2008 上。
static void ConvertExcelToCsv(string excelFilePath, string csvOutputFile, int worksheetNumber = 1) {
if (!File.Exists(excelFilePath)) throw new FileNotFoundException(excelFilePath);
if (File.Exists(csvOutputFile)) throw new ArgumentException("File exists: " + csvOutputFile);
// connection string
var cnnStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"", excelFilePath);
var cnn = new OleDbConnection(cnnStr);
// get schema, then data
var dt = new DataTable();
try {
cnn.Open();
var schemaTable = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (schemaTable.Rows.Count < worksheetNumber) throw new ArgumentException("The worksheet number provided cannot be found in the spreadsheet");
string worksheet = schemaTable.Rows[worksheetNumber - 1]["table_name"].ToString().Replace("'", "");
string sql = String.Format("select * from [{0}]", worksheet);
var da = new OleDbDataAdapter(sql, cnn);
da.Fill(dt);
}
catch (Exception e) {
// ???
throw e;
}
finally {
// free resources
cnn.Close();
}
// write out CSV data
using (var wtr = new StreamWriter(csvOutputFile)) {
foreach (DataRow row in dt.Rows) {
bool firstLine = true;
foreach (DataColumn col in dt.Columns) {
if (!firstLine) { wtr.Write(","); } else { firstLine = false; }
var data = row[col.ColumnName].ToString().Replace("\"", "\"\"");
wtr.Write(String.Format("\"{0}\"", data));
}
wtr.WriteLine();
}
}
}
我的解决方案是为传入文件指定一种格式,该格式表示没有包含混合数据类型的列。解决方案来自业务方面,而不是技术方面。
我有一个 Excel 文件 (xls),其中有一个名为 Money 的列。在 Money 列中,所有列都被格式化为数字,除了一些具有针对它们的标记语句格式化为文本的列。我使用 c# 脚本将 Excel 文件转换为 CSV,该脚本在连接字符串中使用 IMEX=1 来打开它。标记为存储为文本的字段不会进入 csv 文件。文件很大,大约20MB。所以这意味着 33344 等 100 个值不会通过 csv 文件。
我试图延迟打开 Excel 文件的位置。这在我的电脑上有效,但在开发机器上无效。
知道如何在不手动干预的情况下解决这个问题,比如将所有具有混合数据类型的列格式化为数字等吗?我正在寻找一种每次都有效的自动化解决方案。这是在 SSIS 2008 上。
static void ConvertExcelToCsv(string excelFilePath, string csvOutputFile, int worksheetNumber = 1) {
if (!File.Exists(excelFilePath)) throw new FileNotFoundException(excelFilePath);
if (File.Exists(csvOutputFile)) throw new ArgumentException("File exists: " + csvOutputFile);
// connection string
var cnnStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"", excelFilePath);
var cnn = new OleDbConnection(cnnStr);
// get schema, then data
var dt = new DataTable();
try {
cnn.Open();
var schemaTable = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (schemaTable.Rows.Count < worksheetNumber) throw new ArgumentException("The worksheet number provided cannot be found in the spreadsheet");
string worksheet = schemaTable.Rows[worksheetNumber - 1]["table_name"].ToString().Replace("'", "");
string sql = String.Format("select * from [{0}]", worksheet);
var da = new OleDbDataAdapter(sql, cnn);
da.Fill(dt);
}
catch (Exception e) {
// ???
throw e;
}
finally {
// free resources
cnn.Close();
}
// write out CSV data
using (var wtr = new StreamWriter(csvOutputFile)) {
foreach (DataRow row in dt.Rows) {
bool firstLine = true;
foreach (DataColumn col in dt.Columns) {
if (!firstLine) { wtr.Write(","); } else { firstLine = false; }
var data = row[col.ColumnName].ToString().Replace("\"", "\"\"");
wtr.Write(String.Format("\"{0}\"", data));
}
wtr.WriteLine();
}
}
}
我的解决方案是为传入文件指定一种格式,该格式表示没有包含混合数据类型的列。解决方案来自业务方面,而不是技术方面。