使用Logic Apps和ADF迁移Excel数据时,如何获取单元格格式化后的值而非原始值
Logic Apps和ADF迁移Excel数据时,如何获取单元格格式化后的值而非原始值
我太懂你这个头疼的问题了——用Logic Apps把SharePoint的Excel搬到Data Lake,再用ADF导到SQL,结果数据库里全是Excel单元格的原始计算值(比如4,18128342349),但你要的明明是Excel里显示的格式化后的值(比如4.2x)。之前转CSV也没用,因为不管是复制文件还是转格式,工具默认读的都是Excel存储的原始数据,不是界面上的显示文本。
给你几个实用的解决思路,都是我踩过坑后总结的:
方案一:在Logic Apps阶段直接读取格式化值(最省心)
别再直接复制整个Excel文件了,改用SharePoint连接器的List rows present in a table动作:
- 找到这个动作后,点开高级设置,把
Include formatted values选项设为Yes。 - 这个动作会直接返回Excel表格里每个单元格的显示值(就是你在Excel里看到的带x的格式化内容),而不是背后的原始计算值。
- 之后你可以把这些读取到的格式化数据直接保存成CSV/JSON文件上传到Data Lake,再用ADF把这个预处理好的文件导入SQL就行。从源头上就拿到了你要的格式化后的数据,不用再折腾后续的转换。
方案二:在ADF里手动实现格式化逻辑(适合必须保留Excel文件传输的场景)
如果你一定要先把Excel原文件复制到Data Lake再处理,那放弃用Copy Data Activity直接复制,改用ADF的**数据流动(Data Flow)**来做转换:
- 用Excel数据集作为源,读取Data Lake里的Excel文件。
- 添加一个
派生列转换,针对需要格式化的列,根据Excel里的格式化规则写表达式。比如你的场景是把数字四舍五入到1位小数再加x,就用类似concat(round(你的列名, 1), 'x')的表达式。 - 把处理后的派生列替换掉原来的原始列,或者直接用派生列作为新的输出列,最后再把数据写入SQL Sink。
- 注意这个方法需要你明确知道Excel里的格式化规则(比如保留几位小数、后缀是什么),因为ADF没法直接读取Excel的格式化配置来自动转换,得手动对应实现。
方案三:用Office Script预处理Excel为带格式化值的CSV
如果你的Logic Apps是Power Platform生态的,还可以用Office Script来提取显示值:
- 写一个简单的Office Script,遍历Excel的目标表格,提取每个单元格的
text属性(这就是Excel显示的格式化文本),然后把这些内容拼接成CSV格式。 - 在Logic Apps里调用这个Office Script,把生成的CSV直接上传到Data Lake,之后ADF复制这个CSV到SQL就能得到正确的格式化值了。
为啥你之前转CSV没用?
你之前直接转CSV后还是拿到原始值,是因为普通的格式转换工具(包括Logic Apps的内置转换动作)都是读取Excel的原始数据存储内容,不会主动提取显示值。必须要主动指定读取显示值,或者手动实现格式化逻辑才行。
备注:内容来源于stack exchange,提问作者br.nz
相关产品推荐
相关产品推荐

