XlsxReaderWriter 创建只读 .xlsx 文件?

XlsxReaderWriter creating read only .xlsx file?

我正在使用 XlsxReaderWriter | Objective - C 插入数据并生成 .xlsx 文件。我正在使用捆绑目录中的 demo.xlsx,然后复制到文档目录以插入数据,然后用新名称保存它。 demo.xlsx 拥有所有人的读写权限。生成新文件后,我为用户提供了将文件导出到其设备上的 Microsoft Excel 应用程序的选项。当我尝试在 Microsoft Excel 应用程序中打开文件时,它说它是只读文件,我的数据直到 sheet 的 "T" 列未显示,而 sheet 显示来自 "U" 列,其中没有数据。但是数据显示在其他第三方应用程序或文档控制器中,为什么会这样?

我试过的代码:

    let fileManager = NSFileManager.defaultManager()

let directory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let path = "\(directory)/file.txt"

let attributes: [String:AnyObject] = [NSFilePosixPermissions: NSNumber(short: 0o666)]
let success = fileManager.createFileAtPath(path, contents: nil, attributes: attributes)
if success && fileManager.isWritableFileAtPath(path) && fileManager.isReadableFileAtPath(path) {
    NSLog("Worked!")
} else {
    NSLog("Failed!")
}

文件是在我授予权限之前创建的,而不是 "createFileAtPath" 权限设置完美,我检查了文档目录。只是 iOS 上的 Microsoft Excel 应用程序说它仍然是 "Read Only" 文件。

尝试了自己的代码。一样。但它在其他应用程序中完美运行。似乎更像是 Microsoft Excell 应用程序问题。给 Excel 团队反馈,提供你的文件,并要求修复错误,如果没有,无论如何他们会给你比这里更多的信息 SO

我猜问题很可能与文件权限无关,而是与您的应用程序生成的 .xlsx 文件的内容有关,微软 Excel 对此不满意 - 这就是为什么也没有显示所有数据。 .xlsx 文件只是一个包含 xml.

的 zip 文件

您可以使用 unzip 将其解包,然后使用 xmllint --format.

等工具格式化所有 xml 以便于阅读

如果您从自己的应用程序生成一个非常简单的 xlsx 来显示问题(最简单的示例仍然显示问题),然后在 Excel 中从头开始手动创建一个类似的 xlsx,您可以执行对它们进行解压缩和格式化,然后执行 diff -r 找出它们之间的差异。

另一种方法是将显示为 'read only' 的文件加载到桌面 Microsoft excel 中,进行简单的编辑并保存它 - 如果该文件随后正确加载到移动应用程序中,您可以将该文件与您的文件进行比较。

可能会有一定数量的差异,因此您需要动用一些脑力来找出哪些最有可能导致 Excel 将其设为只读。除了任何明显的东西,比如名为 'readonly' 的属性,我会使用旧的 XML 名称空间寻找问题文件之类的东西。

如果您发现不同,您可以通过手动编辑、重新压缩 xml(确保您的编辑器没有留下任何备份文件,因为 Excel 倾向于反对 zip 中的意外文件),然后将其加载到 Excel 并查看它是否仍然是只读的。

这是我用来比较两个 ooxml 文档的 xml 的脚本:

#!/bin/bash

set -e
first=
second=

# convert to absolute paths
first=$(cd $(dirname $first); pwd)/$(basename $first)
second=$(cd $(dirname $second); pwd)/$(basename $second)

WORKDIR=~/tmp.$$

mkdir -p $WORKDIR
cd $WORKDIR
mkdir 1
cd 1
unzip $first
cd ..
mkdir 2
cd 2
unzip $second
cd ..
for i in `find . -name '*.xml' -o -name '*.vml' -o -name '*.rels'`; do
  xmllint --format $i > $i.new
  mv -f $i.new $i
done

diff -U 5 -r 1 2 | cat -v
#or kaleidoscope for better diff display:
#ksdiff 1 2

echo  $WORKDIR
rm -rf $WORKDIR