【问题标题】:SSIS and The Excel Files SagaSSIS 和 Excel 文件传奇
【发布时间】:2015-03-03 16:29:58
【问题描述】:

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

我试图延迟打开 Excel 文件的位置。这适用于我的 PC,但不适用于开发机器。

知道如何在不手动干预的情况下解决这个问题,例如将所有具有混合数据类型的列格式化为数字等?我正在寻找一种每次都有效的自动化解决方案。这是在 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 有什么关系?上面的 C# 函数是脚本任务吗?
  • 他们不想在流程中引入手动步骤,不幸的是,他们可以依靠人们每周都这样做。如果解决方案是您需要识别具有混合数据类型的列并将它们格式化为文本或数字,那么我将不得不在 c# 中解决如何做到这一点。
  • 这是 SSIS 中的脚本任务
  • “文本”行的位置有影响吗?那么,如果将所有带有“money as text”的行移到文件顶部,行为会改变吗?如果是这样,请查看注册表中的 TypeGuessRows 设置。我可以提供更多所需的详细信息

标签: c# sql-server excel ssis


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2021-01-02
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多