- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先让我说我在这里创建了一个帐户,因为我一直在用头撞墙来尝试解决这个问题,所以就这样吧。
另外,这个问题我已经看过了here.这些答案都没有帮助,我都试过了。
我需要创建一个包含简单表格和数据的 word 文档。我决定创建一个示例文档,在其中获取创建文档所需的 xml。我将所有文件夹从解压缩的 docx 文件移动到我的 Assets 文件夹中。一旦我意识到我无法写入 Assets 文件夹,我就写了一个方法来将所有文件和文件夹复制到设备的外部存储位置,然后将我创建的文档写入同一位置。从那里我试图将文件压缩回 .docx 文件。这是事情不工作的地方。
实际的 docx 文件已创建,我可以通过 DDMS 将其移动到我的计算机,但是当我查看它时,Word 说它已损坏。不过,这有什么奇怪的,如果我解压缩它然后在我的计算机上重新压缩它而不做任何更改,那么它就可以完美运行。我使用了一个名为 DiffMerge 的程序(适用于 Mac)将样本解压缩的 docx 文件与我创建的解压缩的 docx 文件进行比较,它说它们完全相同。所以,我认为这与 Android 中的压缩过程有关。
我还尝试在我的计算机上解压缩示例 docx 文件,将所有文件和文件夹移动到我的 Assets 文件夹,包括 document.xml 文件,然后尝试将其压缩而不添加我自己的 document.xml 文件并使用样本之一,那也不起作用。我尝试的另一件事是将实际的 docx 文件放在我的 Assets 文件夹中,将其解压缩到我的外部存储中,然后在不执行任何操作的情况下重新压缩它。这也失败了。
我基本上是不知所措。请有人帮我解决这个问题。
这是我的一些代码:
.
private boolean moveDocxFoldersFromAssetsToExternalStorage(){
File rootDir = new File(this.externalPath);
rootDir.mkdir();
copy("");
// This is to get around a glitch in Android which doesnt list files or folders
// with an underscore at the beginning of the name in the assets folder.
// This renames them once they are saved to the device.
// We need it to show up in the list in order to move them.
File relsDir = new File(this.externalPath + "/word/rels");
File renameDir = new File(this.externalPath + "/word/_rels");
relsDir.renameTo(renameDir);
relsDir = new File(this.externalPath + "/rels");
renameDir = new File(this.externalPath + "/_rels");
relsDir.renameTo(renameDir);
// This is to get around a glitch in Android which doesnt list hidden files.
// We need it to show up in the list in order to move it.
relsDir = new File(this.externalPath + "/_rels/rels.rename");
renameDir = new File(this.externalPath + "/_rels/.rels");
relsDir.renameTo(renameDir);
return true;
}
private void copy(String outFileRelativePath){
String files[] = null;
try {
files = this.mAssetManager.list(ASSETS_RELATIVE_PATH + outFileRelativePath);
} catch (IOException e) {
e.printStackTrace();
}
String assetFilePath = null;
for(String fileName : files){
if(!fileName.contains(".")){
String outFile = outFileRelativePath + java.io.File.separator + fileName;
copy(outFile);
} else {
File createFile = new File(this.externalPath + java.io.File.separator + outFileRelativePath);
createFile.mkdir();
File file = new File(createFile, fileName);
assetFilePath =
ASSETS_RELATIVE_PATH + outFileRelativePath + java.io.File.separator + fileName;
InputStream in = null;
OutputStream out = null;
try {
in = this.mAssetManager.open(assetFilePath);
out = new FileOutputStream(file);
copyFile(in, out);
in.close();
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
private void zipFolder(String srcFolder, String destZipFile) throws Exception{
FileOutputStream fileWriter = new FileOutputStream(destZipFile);
ZipOutputStream zip = new ZipOutputStream(fileWriter);
zip.setMethod(Deflater.DEFLATED);
zip.setLevel(ZipOutputStream.STORED);
addFolderToZip(this.externalPath, "", zip);
zip.finish();
zip.close();
}
private void addFolderToZip(String externalPath, String folder, ZipOutputStream zip){
File file = new File(externalPath);
String files[] = file.list();
for(String fileName : files){
try {
File currentFile = new File(externalPath, fileName);
if(currentFile.isDirectory()){
String outFile = externalPath + java.io.File.separator + fileName;
addFolderToZip(outFile, folder + java.io.File.separator + fileName, zip);
} else {
byte[] buffer = new byte[8000];
int len;
FileInputStream in = new FileInputStream(currentFile);
zip.putNextEntry(new ZipEntry(folder + java.io.File.separator + fileName));
while((len = in.read(buffer)) > 0){
zip.write(buffer, 0, len);
}
zip.closeEntry();
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
编辑
这是我根据 @edi9999 下面所说的内容编写的代码,以便使其正常工作。我创建了一个单独的类,我将对其进行扩展和添加,并且可能会进行一些清理,但这是有效的代码。它将目录中的所有文件添加到 zip 文件,并递归调用自身以添加所有子文件和文件夹。
private class Zip {
private ZipOutputStream mZipOutputStream;
private String pathToZipDestination;
private String pathToFilesToZip;
public Zip(String pathToZipDestination, String pathToFilesToZip) {
this.pathToZipDestination = pathToZipDestination;
this.pathToFilesToZip = pathToFilesToZip;
}
public void zipFiles() throws Exception{
FileOutputStream fileWriter = new FileOutputStream(pathToZipDestination);
this.mZipOutputStream = new ZipOutputStream(fileWriter);
this.mZipOutputStream.setMethod(Deflater.DEFLATED);
this.mZipOutputStream.setLevel(8);
AddFilesToZip("");
this.mZipOutputStream.finish();
this.mZipOutputStream.close();
}
private void AddFilesToZip(String folder){
File mFile = new File(pathToFilesToZip + java.io.File.separator + folder);
String mFiles[] = mFile.list();
for(String fileName : mFiles){
File currentFile;
if(folder != "")
currentFile = new File(pathToFilesToZip, folder + java.io.File.separator + fileName);
else
currentFile = new File(pathToFilesToZip, fileName);
if(currentFile.isDirectory()){
if(folder != "")
AddFilesToZip(folder + java.io.File.separator + currentFile.getName());
else
AddFilesToZip(currentFile.getName());
} else {
try{
byte[] buffer = new byte[8000];
int len;
FileInputStream in = new FileInputStream(currentFile);
if(folder != ""){
mZipOutputStream.putNextEntry(new ZipEntry(folder + java.io.File.separator + fileName));
} else {
mZipOutputStream.putNextEntry(new ZipEntry(fileName));
}
while((len = in.read(buffer)) > 0){
mZipOutputStream.write(buffer, 0, len);
}
mZipOutputStream.closeEntry();
in.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
}
}
最佳答案
我想我有什么问题。
当我打开你的corrupted File , 然后在 winrar 上打开它,我在文件夹的开头看到了反斜杠,这是不寻常的:
当我解压缩文件后重新压缩文件时,反斜杠不再存在,文件在 Word 中打开,所以我认为这应该是问题所在。
我认为这里的代码是错误的:
String outFile = externalPath + java.io.File.separator + fileName;
应该是
if (externalPath=="")
String outFile = externalPath + fileName;
else
String outFile = externalPath + java.io.File.separator + fileName;
关于java - 使用压缩生成损坏的 docx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995397/
我有一个来自 C# 库的 Paragraph 对象 DocX并尝试设置 LineSpacing 属性但没有任何效果? internal static Paragraph StandardFormat(
我正在寻找一种方法来提取文档中每个单词的位置 (x, y) 和属性(字体/大小)。 从 python-docx 文档中,我知道: Conceptually, Word documents have t
我有一个带有空表的 .docx 模板,我要在其中添加值: def manipulate_table(): table = doc.tables[0] table.cell(0, 0).text = '
我目前正在开发一个将 docx 文件作为输入并使用它来构建 html 页面的库,由于 docx 的模糊和缺乏文档,我不得不严重依赖示例输出来决定如何处理某些事情。其中之一是超链接。 就我目前所见,do
使用以下代码,我尝试创建一个文档,其中第 2 页和第 3 页为横向,而其他页为纵向。所有尺寸都应为 8.5"x 11"。 using (System.IO.MemoryStream ms = new
我使用了 python-docx 中的示例,在运行代码后,我找不到 docx 文件在哪里,我可以指出要添加的特定路径吗? from docx import Document from docx.sha
我对 python-docx 中“运行级别内容”的概念有些困惑。我明白,如果我想检查一个段落是否以粗体显示,我需要检查 run.bold,但究竟是什么它? 官方定义是:运行是与内联内容最密切相关的对象
我了解到 .docx 文件基本上是二进制文件。但我不知道下面的结构。 .docx 文件的基本结构是什么?比如,标题有多长?实际的文档内容从什么时候开始?最后有签名吗? 基本上,.docx 文件的结构是
我正在尝试将 .adoc 文件转换为 .docx 实际上我正在使用: asciidoctor file.adoc -o file.html pandoc -s -S file.html -o outp
我可能错过了一些东西或犯了一个错误,无论如何,我似乎无法访问 .docx 模板中字典中的数据。文档说它的工作方式类似于 jinja2,但使用 {{ dict['dict_key'] }} 即使在 if
我遇到了有关如何使用 C# 合并 docx 文件的解决方案: Append multiple DOCX files together 在此解决方案中,他遍历文件并将正文“outerxml”复制到新文档
我正在使用 Docx dll 获取段落信息但无法获取段落格式(字体大小-字体名称-字体颜色) 这是我的代码: using (DocX document = DocX.Load("Tes
使用 Markdown 代码块时,DOCX 文档中生成的等宽字体大小太大。 我可以通过指定自定义 template.docx 文件来调整段落的字体大小,但由于某种原因,生成的代码块不使用段落样式,这与
doc=Document() table = doc.add_table(rows = 13, cols = 5) table.style = 'Table Grid' row = table.row
我想打开一个现有的 Word 文档,我已经在其中添加了页码,然后向其中添加了一些文本和标题。 这是我如何尝试实现目标的基本示例 #!/usr/bin/env python from docx impo
我想使用 DocX Library 将图像添加到 C# 中的 Word 文件中.问题是我在网上找不到任何东西。 情况 我知道如何创建文件,我知道如何在文件中写入文本。遗憾的是,图书馆的文档非常小。希望
我已经下载并开始使用 DocX library .我有一个名为 template.docx 的文档正在加载到内存中。我在该文档中有一个表,其中包含 id = 241。我想通过它的 id 获取该表并向其
是否可以使用应用了样式的 python-docx 将 HTML 插入到文档中?我唯一需要做的就是斜体。 例如如何插入"Today is Saturday."星期六实际上是用斜体插入的吗? 谢谢! 最佳
我想在命令行 (Linux) 中执行此操作,这样我就可以自动执行它,而无需在中间设置用户界面。 最佳答案 WordprocessingML 中没有明确的页面布局模型。 但是,如果文件最后是由 Word
我必须以 docx 格式存储一些文档,但无法忍受使用 msword:我想编辑某种纯文本标记,除了基于 XML 的东西(我也不喜欢那样)和从/到那个到/从 docx 转换。 有什么选择吗? 编辑:由于人
我是一名优秀的程序员,十分优秀!