Power Query中数据源不存在时如何跳过文件处理?
Power Query 路径空值与空文件夹处理方案
需求说明
实现Power Query从单元格获取源文件路径时的两种异常处理:
- 存储路径的单元格内容为空(null或空字符串)
- 目标文件夹中无文件
要求以上两种情况均跳过后续处理,返回指定结构的空表。
现有代码
let DigitalCallPath = Excel.CurrentWorkbook(){[Name="DigitalCallPath"]}[Content][Column1]{0}, Origen = Folder.Files(DigitalCallPath), #"Archivos ocultos filtrados1" = Table.SelectRows(Origen, each [Attributes]?[Hidden]? <> true), #"Invocar función personalizada1" = Table.AddColumn(#"Archivos ocultos filtrados1", "Transformar archivo (2)", each #"Transformar archivo (2)"([Content])), #"Columnas con nombre cambiado1" = Table.RenameColumns(#"Invocar función personalizada1", {"Name", "Source.Name"}), #"Otras columnas quitadas1" = Table.SelectColumns(#"Columnas con nombre cambiado1", {"Source.Name", "Transformar archivo (2)"}), #"Columna de tabla expandida1" = Table.ExpandTableColumn(#"Otras columnas quitadas1", "Transformar archivo (2)", Table.ColumnNames(#"Transformar archivo (2)"(#"Archivo de ejemplo (2)"))), #"Tipo cambiado" = Table.TransformColumnTypes(#"Columna de tabla expandida1",{{"Source.Name", type text}, {"Id. de la cuenta (NO modificar campo)", type text}, {"Nombre", type text}, {"Apellidos", type text}, {"a/o", type text}, {"Genero", type text}, {"Nº de Documento", Int64.Type}, {"Fecha de nacimiento", type any}, {"Correo electrónico", type text}, {"Teléfono Celular", Int64.Type}, {"Teléfono particular", type any}, {"Calle", type text}, {"Ciudad", type text}, {"Provincia", type text}, {"Código postal", Int64.Type}, {"Banco (Ver desplegable)", type text}, {"Tarjeta (Ver desplegable)", type any}, {"Nº de Tarjeta", type text}, {"Vencimiento", type date}, {"Recibo (No modificar)", type any}, {"Descripción Fuente (No modificar)", type any}, {"Descripción Origen (Nombre del operador)", type text}, {"Fecha Ingreso", type date}, {"Comentarios", type text}, {"Monto Donacion", Int64.Type}, {"País (No modificar)", type text}, {"Id. del propietario (No modificar)", type text}, {"Autoriza llamadas (No modificar)", type text}, {"Fecha de alta (Dejarlo vacío)", type any}, {"Fuente (No modificar)", type text}, {"Autoriza envío postal", type text}, {"Correo electonico alternativo", type any}, {"Pack Fin de Año (Ver desplegable)", type text}, {"Relación con donante (No modificar)", type text}, {"Tipo de direccion", type text}, {"Tipo de Documento", type text}, {"Welcome Pack (Ver desplegable)", type text}, {"Modalidad ", type text}, {"Base", type text}}), #"Filas filtradas" = Table.SelectRows(#"Tipo cambiado", each ([Nombre] <> null)), #"Columnas con nombre cambiado" = Table.RenameColumns(#"Filas filtradas",{{"Nombre", "Nombre"}, {"Apellidos", "Apellido"}, {"Genero", "Genero__c"}, {"Nº de Documento", "N_de_Documento__c"}, {"Fecha de nacimiento", "Birthdate"}, {"Correo electrónico", "Email"}, {"Teléfono Celular", "MobilePhone"}, {"Teléfono particular", "HomePhone"}, {"Calle", "MailingStreet"}, {"Código postal", "MailingPostalCode"}, {"Descripción Origen (Nombre del operador)", "Descripci_n_Origen__c"}, {"Base", "Campaña"}, {"Monto Donacion", "Monto_Donacion__c"}, {"Fecha Ingreso", "Fecha_Ingreso__c"}, {"Banco (Ver desplegable)", "Entidad Bancaria"}, {"Tarjeta (Ver desplegable)", "Tipo de Tarjeta"}, {"Nº de Tarjeta", "Numero de Tarjeta"}, {"Ciudad", "MailingCity"}}), Fuente__c = Table.AddColumn(#"Columnas con nombre cambiado", "Fuente__c", each "Telemarketing"), Descripci_n_Fuente__c = Table.AddColumn(Fuente__c, "Descripci_n_Fuente__c", each "Digital Call"), #"Columnas quitadas" = Table.RemoveColumns(Descripci_n_Fuente__c,{"Id. de la cuenta (NO modificar campo)", "a/o", "Recibo (No modificar)", "Descripción Fuente (No modificar)", "Id. del propietario (No modificar)", "Autoriza llamadas (No modificar)", "Fecha de alta (Dejarlo vacío)", "Autoriza envío postal", "Correo electonico alternativo", "Pack Fin de Año (Ver desplegable)", "Tipo de direccion", "Tipo de Documento", "Welcome Pack (Ver desplegable)", "Modalidad ", "País (No modificar)", "Fuente (No modificar)", "Relación con donante (No modificar)"}), #"Columnas con nombre cambiado2" = Table.RenameColumns(#"Columnas quitadas",{{"Vencimiento", "Vencimiento__c"}, {"Comentarios", "Comentarios__c"}}) in #"Columnas con nombre cambiado2"
此前尝试的写法
- IF...Then...Else:未正确嵌入Power Query的表达式结构中
- Try...Otherwise:
let DigitalCallPath = Excel.CurrentWorkbook(){[Name="DigitalCallPath"]}[Content][Column1]{0}, Origen = Folder.Files(DigitalCallPath), // Check if DigitalCallPath is null or empty if DigitalCallPath = null or DigitalCallPath = "" then // Return immediately if DigitalCallPath is null or empty return; else // Continue with the rest of the instructions #"Archivos ocultos filtrados1" = Table.SelectRows(Origen, each [Attributes]?[Hidden]? <> true),
解决方案
修改后的代码将空值判断和空文件夹判断前置,符合Power Query的表达式语法:
let // 获取路径单元格内容 DigitalCallPath = Excel.CurrentWorkbook(){[Name="DigitalCallPath"]}[Content][Column1]{0}, // 定义需要返回的空表结构 EmptyTable = #table( {"Id. de la cuenta (NO modificar campo)", "Nombre", "Apellidos", "a/o", "Genero", "Nº de Documento", "Fecha de nacimiento", "Correo electrónico", "Teléfono Celular", "Teléfono particular", "Calle", "Ciudad", "Provincia", "Código postal", "Banco (Ver desplegable)", "Tarjeta (Ver desplegable)", "Nº de Tarjeta", "Vencimiento", "Recibo (No modificar)", "Descripción Fuente (No modificar)", "Descripción Origen (Nombre del operador)", "Fecha Ingreso", "Comentarios", "Monto Donacion", "País (No modificar)", "Id. del propietario (No modificar)", "Autoriza llamadas (No modificar)", "Fecha de alta (Dejarlo vacío)", "Fuente (No modificar)", "Autoriza envío postal", "Correo electonico alternativo", "Pack Fin de Año (Ver desplegable)", "Relación con donante (No modificar)", "Tipo de direccion", "Tipo de Documento", "Welcome Pack (Ver desplegable)", "Modalidad ", "Base"}, {} ), // 判断路径是否为空 Process = if DigitalCallPath = null or DigitalCallPath = "" then EmptyTable else let Origen = Folder.Files(DigitalCallPath), // 判断文件夹是否有文件 CheckFiles = if Table.RowCount(Origen) = 0 then EmptyTable else let #"Archivos ocultos filtrados1" = Table.SelectRows(Origen, each [Attributes]?[Hidden]? <> true), #"Invocar función personalizada1" = Table.AddColumn(#"Archivos ocultos filtrados1", "Transformar archivo (2)", each #"Transformar archivo (2)"([Content])), #"Columnas con nombre cambiado1" = Table.RenameColumns(#"Invocar función personalizada1", {"Name", "Source.Name"}), #"Otras columnas quitadas1" = Table.SelectColumns(#"Columnas con nombre cambiado1", {"Source.Name", "Transformar archivo (2)"}), #"Columna de tabla expandida1" = Table.ExpandTableColumn(#"Otras columnas quitadas1", "Transformar archivo (2)", Table.ColumnNames(#"Transformar archivo (2)"(#"Archivo de ejemplo (2)"))), #"Tipo cambiado" = Table.TransformColumnTypes(#"Columna de tabla expandida1",{{"Source.Name", type text}, {"Id. de la cuenta (NO modificar campo)", type text}, {"Nombre", type text}, {"Apellidos", type text}, {"a/o", type text}, {"Genero", type text}, {"Nº de Documento", Int64.Type}, {"Fecha de nacimiento", type any}, {"Correo electrónico", type text}, {"Teléfono Celular", Int64.Type}, {"Teléfono particular", type any}, {"Calle", type text}, {"Ciudad", type text}, {"Provincia", type text}, {"Código postal", Int64.Type}, {"Banco (Ver desplegable)", type text}, {"Tarjeta (Ver desplegable)", type any}, {"Nº de Tarjeta", type text}, {"Vencimiento", type date}, {"Recibo (No modificar)", type any}, {"Descripción Fuente (No modificar)", type any}, {"Descripción Origen (Nombre del operador)", type text}, {"Fecha Ingreso", type date}, {"Comentarios", type text}, {"Monto Donacion", Int64.Type}, {"País (No modificar)", type text}, {"Id. del propietario (No modificar)", type text}, {"Autoriza llamadas (No modificar)", type text}, {"Fecha de alta (Dejarlo vacío)", type any}, {"Fuente (No modificar)", type text}, {"Autoriza envío postal", type text}, {"Correo electonico alternativo", type any}, {"Pack Fin de Año (Ver desplegable)", type text}, {"Relación con donante (No modificar)", type text}, {"Tipo de direccion", type text}, {"Tipo de Documento", type text}, {"Welcome Pack (Ver desplegable)", type text}, {"Modalidad ", type text}, {"Base", type text}}), #"Filas filtradas" = Table.SelectRows(#"Tipo cambiado", each ([Nombre] <> null)), #"Columnas con nombre cambiado" = Table.RenameColumns(#"Filas filtradas",{{"Nombre", "Nombre"}, {"Apellidos", "Apellido"}, {"Genero", "Genero__c"}, {"Nº de Documento", "N_de_Documento__c"}, {"Fecha de nacimiento", "Birthdate"}, {"Correo electrónico", "Email"}, {"Teléfono Celular", "MobilePhone"}, {"Teléfono particular", "HomePhone"}, {"Calle", "MailingStreet"}, {"Código postal", "MailingPostalCode"}, {"Descripción Origen (Nombre del operador)", "Descripci_n_Origen__c"}, {"Base", "Campaña"}, {"Monto Donacion", "Monto_Donacion__c"}, {"Fecha Ingreso", "Fecha_Ingreso__c"}, {"Banco (Ver desplegable)", "Entidad Bancaria"}, {"Tarjeta (Ver desplegable)", "Tipo de Tarjeta"}, {"Nº de Tarjeta", "Numero de Tarjeta"}, {"Ciudad", "MailingCity"}}), Fuente__c = Table.AddColumn(#"Columnas con nombre cambiado", "Fuente__c", each "Telemarketing"), Descripci_n_Fuente__c = Table.AddColumn(Fuente__c, "Descripci_n_Fuente__c", each "Digital Call"), #"Columnas quitadas" = Table.RemoveColumns(Descripci_n_Fuente__c,{"Id. de la cuenta (NO modificar campo)", "a/o", "Recibo (No modificar)", "Descripción Fuente (No modificar)", "Id. del propietario (No modificar)", "Autoriza llamadas (No modificar)", "Fecha de alta (Dejarlo vacío)", "Autoriza envío postal", "Correo electonico alternativo", "Pack Fin de Año (Ver desplegable)", "Tipo de direccion", "Tipo de Documento", "Welcome Pack (Ver desplegable)", "Modalidad ", "País (No modificar)", "Fuente (No modificar)", "Relación con donante (No modificar)"}), #"Columnas con nombre cambiado2" = Table.RenameColumns(#"Columnas quitadas",{{"Vencimiento", "Vencimiento__c"}, {"Comentarios", "Comentarios__c"}}) in #"Columnas con nombre cambiado2" in CheckFiles in Process
关键修改点
- 提前定义空表:将指定结构的空表定义为
EmptyTable变量,避免重复代码 - 路径空值判断:先检查
DigitalCallPath是否为null或空字符串,是则直接返回空表 - 空文件夹判断:获取文件夹文件列表后,用
Table.RowCount(Origen)判断是否有文件,无文件则返回空表 - 嵌套表达式结构:符合Power Query的
let...in语法规则,将分支逻辑正确嵌套
内容的提问来源于stack exchange,提问作者Julian Tutusaus
相关产品推荐
相关产品推荐

