SSIS和Excel文件传奇

本文关键字:传奇 文件 Excel SSIS | 更新日期: 2024-09-25 10:38:15

我有一个Excel文件(xls),它有一个名为Money的列。在Money列中,所有列都被格式化为数字,除了一些列的标记语被格式化为文本。我使用c#脚本将Excel文件转换为CSV,该脚本在连接字符串中使用IMEX=1来打开它。标记为存储为文本的字段不会进入CSV文件。该文件很大,大约为20MB。因此,这意味着100个值(如33344等)不会出现在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();
      }
   }
}

SSIS和Excel文件传奇

我的解决方案是为传入文件指定一种格式,该格式表示没有混合数据类型的列。解决方案来自业务而非技术。