我有一个.xls文件,我想要打印得很漂亮,而不仅仅是改变了二进制文件。
我的方法是unzip
这整件事。生成的字符串不包含换行符,因此我通过xmllint --format
运行它。但是在这条看似简单的道路上,我遇到了几个问题,我已经花了好几个小时了:
unzip
xml存档中的多个文件。这会导致xml无效。即使使用unzip -q
选项,我也会获得多个DTD,依此类推。 xmllint在没有格式化输入的情况下打破了这个。
unzip -c -a -q myFile.xlsx | xmllint --format -
我尝试使用read
将XML拆分为数组,以便将每个xml文件都提供给xmllint。在read
的结果中,大多数数组项似乎都是空的,第三项和第四项包含xml字符串的20个字母。
IFS='\<\?xml' read -r -a files <<< "$decompressed"
我还尝试使用sed
插入换行符,但文件大小太大,以至于处理时间太长,无法进行差异化。
${decompressed/\>\</\>\n\</g}
我刚刚用完了想法所以我决定咨询你们!提前谢谢:)
答案 0 :(得分:1)
正如您已经发现的那样,XLSX文件包含多个XML文件,如official documentation中所述。特别是,每个Excel工作表将有一个XML文档,这意味着只是将它们组合起来将不是一个实用的解决方案。
更糟糕的是,Excel文件中也可能有shared string table,这意味着工作表文件本身不会包含原始字符串(&#34; Hello,World!&#34;)但是而只是对字符串表(1234)的引用。
根据您的使用情况,您可能需要考虑更多基于文本的格式,例如CSV。
答案 1 :(得分:1)
我会将xslx解压缩到多个文件中,然后打印它们然后在xml文件上执行递归diff。 (还有二进制文件无法区分)
像这样:
# Unzip the xlsx files into folders
unzip -aqd foo foo.xlsx
unzip -aqd bar bar.xlsx
# Pretty print all .xml and .rels files
find foo bar \( -name '*.xml' -o -name '*.rels' \) -exec xmllint --format {} --output {} \;
# Now you can recursively diff them
diff -urN foo bar
您可以创建包装过程的bash函数。
注意:解压缩的xlsx文件可能包含.bin
结尾的二进制文件。您需要将它们从diff中排除:
diff -urNx '*.bin' foo bar