替换存储在表示Word/Excel文档的字节数组中的字符串

本文关键字:字节 字节数 数组 字符串 文档 Excel 存储 表示 Word 替换 | 更新日期: 2023-09-27 18:02:15

我在SQL Server数据库表中存储Word和Excel文档。这些文档是用我的c#应用程序从数据库中提取出来的,并放入byte[]数组中。

我想替换在Word/Excel文档中找到的某些字符串。对于可用的字节数组,最好的方法是什么?

我在看这样的东西:

string fileString = System.Text.Encoding.UTF8.GetString(image.ImageObject);
fileString = fileString.Replace("FROM", "TO");
byte[] newImageObject = System.Text.Encoding.UTF8.GetBytes(fileString);

替换存储在表示Word/Excel文档的字节数组中的字符串

我相信你必须将字节保存为Word/Excel文件,并使用办公自动化工具进行更改。

如果你随意改变二进制文件中的字节,你可能会弄乱偏移量,校验和,CRC检查,触发杀毒软件等

我建议您使用Open XML SDK。

使用库,您可以执行以下操作来替换Word文档中的文本,考虑到documentByteArray是从数据库中获取的文档字节内容:

using (MemoryStream mem = new MemoryStream())
{
    mem.Write(documentByteArray, 0, (int)documentByteArray.Length);
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        string docText = null;
        using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
        {
            docText = sr.ReadToEnd();
        }
        Regex regexText = new Regex("Hello world!");
        docText = regexText.Replace(docText, "Hi Everyone!");
        using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
        {
            sw.Write(docText);
        }
    }
}

上面的例子是从这里取的。您可以对Excel电子表格执行类似的操作。

你的方法很可能会失败。

如果你谈论的是。doc和。xls,这些文件格式是二进制的,这使得字节流很可能包含无效的UTF-8字节序列。

即使不是这样,替换不同长度的字符串也会使偏移量和长度字段无效,从而导致文档在打开时失败。

另一方面,如果您谈论的是.docx和.xslx,那么这些文件实际上是压缩的XML文件,同样不能简单地进行搜索和替换:只需考虑查找字符串匹配XML元素或属性名称(或其中的一部分)。同样,替换操作不能对整个文件进行操作。