代码之家  ›  专栏  ›  技术社区  ›  Omkar Jadhav

XlsxReaderWriter正在创建只读。xlsx文件?

  •  2
  • Omkar Jadhav  · 技术社区  · 7 年前

    我正在使用 XlsxReaderWriter | Objective - C 插入数据并生成。xlsx文件。我正在使用演示。xlsx从bundle目录复制到documents目录以插入数据,然后用新名称保存数据。演示。xlsx已为每个人读写权限。生成新文件后,我给用户一个选项,将文件导出到他们设备上的Microsoft Excel应用程序。当我试图在Microsoft Excel应用程序中打开文件时,它会显示为只读文件,我的数据直到工作表的“T”列未显示,工作表从“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上的微软Excel应用程序说它仍然是“只读”文件。

    2 回复  |  直到 7 年前
        1
  •  1
  •   JosephH    7 年前

    我猜想问题可能与文件权限无关,而与文件的内容有关。您的应用程序生成的xlsx文件令Microsoft Excel不满意,因此它也没有显示所有数据。A.xlsx文件只是一个包含xml的zip文件。

    您可以使用 unzip ,然后使用以下工具格式化所有xml以便于阅读: xmllint --format .

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

    另一种方法是将显示为“只读”的文件加载到桌面microsoft excel中,进行简单的编辑并保存-如果该文件随后正确加载到移动应用程序中,您可以将该文件与您的文件进行区分。

    可能会有相当数量的差异,因此您需要运用一些脑力来找出哪些差异最有可能导致Excel成为只读。除了名为“readonly”的属性之类的明显内容外,我还将查找使用旧XML命名空间的问题文件之类的内容。

    如果您发现了另一个问题,您可以通过手动编辑、重新压缩xml(确保您的编辑器不会留下任何备份文件,因为Excel往往会反对压缩文件中的意外文件),快速找到问题所在,然后将其加载到Excel中,查看它是否仍然是只读的。

    #!/bin/bash
    
    set -e
    first=$1
    second=$2
    
    # 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
    
        2
  •  0
  •   Максуд Даудов    7 年前

    尝试了自己的代码。同样的事情。但它在其他应用程序中运行良好。看起来更像是微软Excel应用程序的问题。向Excell团队提供反馈,提供您的文件,并要求修复错误,如果没有,无论如何,他们会给您更多信息