许多服务将数据导出为逗号分隔值 (CSV) 文件。 此解决方案以.xlsx文件格式自动将这些 CSV 文件转换为 Excel 工作簿的过程。 它使用 Power Automate 流在 OneDrive 文件夹中查找扩展名为 .csv 的文件,并使用 Office 脚本将数据从 .csv 文件复制到新的 Excel 工作簿中。

  • 将.csv文件和空白“模板”.xlsx文件存储在 OneDrive 文件夹中。
  • 创建 Office 脚本以将 CSV 数据分析为某个范围。
  • 创建 Power Automate 流以读取.csv文件并将其内容传递给脚本。
  • 下载 convert-csv-example.zip 以获取Template.xlsx文件和两个示例.csv文件。 将文件提取到 OneDrive 中的文件夹中。 此示例假定文件夹名为“output”。

    添加以下脚本,并使用提供的步骤生成流,以便自行试用示例!

    示例代码:将逗号分隔值插入工作簿

    * Convert incoming CSV data into a range and add it to the workbook. function main(workbook: ExcelScript.Workbook, csv: string) { let sheet = workbook.getWorksheet("Sheet1"); // Remove any Windows \r characters. csv = csv.replace(/\r/g, ""); // Split each line into a row. let rows = csv.split("\n"); * For each row, match the comma-separated sections. * For more information on how to use regular expressions to parse CSV files, * see this Stack Overflow post: https://stackoverflow.com/a/48806378/9227753 const csvMatchRegex = /(?:,|\n|^)("(?:(?:"")*[^"]*)*"|[^",\n]*|(?:\n|$))/g rows.forEach((value, index) => { if (value.length > 0) { let row = value.match(csvMatchRegex); // Check for blanks at the start of the row. if (row[0].charAt(0) === ',') { row.unshift(""); // Remove the preceding comma. row.forEach((cell, index) => { row[index] = cell.indexOf(",") === 0 ? cell.substr(1) : cell; // Create a 2D array with one row. let data: string[][] = []; data.push(row); // Put the data in the worksheet. let range = sheet.getRangeByIndexes(index, 0, 1, data[0].length); range.setValues(data); // Add any formatting or table creation that you want.

    Power Automate 流:创建新的.xlsx文件

  • 登录到 Power Automate 并创建新的 计划云流

  • 将流设置为每隔“1”“天 重复 ”,然后选择“ 创建 ”。

  • 获取模板 Excel 文件。 这是所有已转换.csv文件的基础。 添加使用 OneDrive for Business 连接器和 获取文件内容 操作 的新步骤 。 提供“Template.xlsx”文件的文件路径。

  • 文件 :/output/Template.xlsx
  • 重命名 获取文件内容 步骤,方法是转到) 连接器右上角 (...) 步骤的“ 获取文件内容 ”菜单 (,然后选择 “重命名” 选项。 将步骤名称更改为“获取 Excel 模板”。

  • 获取“输出”文件夹中的所有文件。 添加使用 OneDrive for Business 连接器和 “在文件夹中列出文件” 操作 的新步骤 。 提供包含.csv文件的文件夹路径。

  • 文件夹 :/output
  • 添加条件,以便流仅对.csv文件运行。 添加“ 条件” 控件的新 步骤 。 对 Condition 使用以下值。

  • 选择一个值 名称 ( 文件夹) 中的“列出文件” 中的 动态内容。 请注意,此动态内容具有多个结果,因此 “应用于每个 ”控件将围绕 “条件 ”。
  • 下拉列表中的 (结尾)
  • 选择值 :.csv
  • 流的其余部分位于 “如果是 ”部分下,因为我们只想对.csv文件进行操作。 通过添加使用 OneDrive for Business 连接器和 获取文件内容 操作 的新步骤 ,获取单个 .csv 文件。 使用文件夹中 列出文件中 动态内容的 ID

  • 文件 id (“ 列出文件夹中的文件 ”步骤) 中的动态内容
  • 将新的 “获取文件内容 ”步骤重命名为“获取.csv文件”。 这有助于将此文件与 Excel 模板区分开来。

  • 使用 Excel 模板作为基内容制作新的.xlsx文件。 添加使用 OneDrive for Business 连接器和 “创建文件” 操作 的新步骤 。 使用以下值。

  • 文件夹路径 :/output
  • 文件名 名称不带扩展名 .xlsx (从 “列出文件夹中的文件 ”中选择 “名称”, 并在) 后手动键入“.xlsx”
  • 文件内容 获取 Excel 模板 ) 的文件内容 (动态内容
  • 运行脚本以将数据复制到新工作簿中。 使用 “运行脚本” 操作添加 Excel Online (Business) 连接器。 对操作使用以下值。

  • 位置 :OneDrive for Business
  • 文档库 :OneDrive
  • 文件 创建文件 ) (动态内容的 ID
  • 脚本 :转换 CSV
  • csv 获取 .csv文件) (动态内容
  • 保存流。 使用流编辑器页上的“ 测试 ”按钮,或通过“我的流”选项卡运行 。请务必在出现提示时允许访问。

  • 应在“输出”文件夹中找到新的.xlsx文件,以及原始.csv文件。 新工作簿包含与 CSV 文件相同的数据。

    若要在不使用 Power Automate 的情况下测试脚本,请在使用前为其 csv 分配一个值。 添加以下代码作为函数的第一行, main 然后选择“ 运行 ”。

      csv = `1, 2, 3
             4, 5, 6
             7, 8, 9`;
    

    分号分隔的文件和其他备用分隔符

    某些区域使用分号 (';') 分隔单元格值,而不是逗号。 在这种情况下,需要更改脚本中的以下行。

  • 将逗号替换为正则表达式语句中的分号。 这从 let row = value.match开始。

    let row = value.match(/(?:;|\n|^)("(?:(?:"")*[^"]*)*"|[^";\n]*|(?:\n|$))/g);
    
  • 将逗号替换为空白第一个单元格的复选中的分号。 这从 if (row[0].charAt(0)开始。

    if (row[0].charAt(0) === ';') {
    
  • 将逗号替换为行中的分号,从显示的文本中删除分隔字符。 这从 row[index] = cell.indexOf开始。

       row[index] = cell.indexOf(";") === 0 ? cell.substr(1) : cell;
    

    大型 CSV 文件

    如果文件包含数十万个单元格,则可以达到 Excel 数据传输限制。 需要强制脚本定期与 Excel 同步。 执行此操作的最简单方法是在处理一批行后调用 console.log 。 添加以下代码行以执行此操作。

  • 在 之前 rows.forEach((value, index) => {,添加以下行。

      let rowCount = 0;
    
  • 在 之后 range.setValues(data);,添加以下代码。 请注意,根据列数,可能需要减少 5000 到较小的数字。

      rowCount++;
      if (rowCount % 5000 === 0) {
        console.log("Syncing 5000 rows.");
    
  •