以编程方式编辑xlsx XML会导致其损坏

时间:2016-07-27 19:45:01

标签: xml excel qt

所以我在Qt 5.6中创建了一个Qt程序,用于读取和写入Excel文件(使用Qt Xlsx 0.3)。我想编辑一个drawing.xml文件,所以我使用QDomDocument这样做。我改变了一件事,来自:

            <a:p>
                <a:pPr rtl="0"/>
                <a:r>
                    <a:rPr b="0" baseline="0" i="0" lang="en-GB" sz="1100">
                        <a:effectLst/>
                        <a:latin typeface="+mn-lt"/>
                        <a:ea typeface="+mn-ea"/>
                        <a:cs typeface="+mn-cs"/>
                    </a:rPr>
                    <a:t>J1: 0 </a:t>
                </a:r>
            </a:p>

到此:

            <a:p>
                <a:pPr rtl="0"/>
                <a:r>
                    <a:rPr b="0" baseline="0" i="0" lang="en-GB" sz="1100">
                        <a:effectLst/>
                        <a:latin typeface="+mn-lt"/>
                        <a:ea typeface="+mn-ea"/>
                        <a:cs typeface="+mn-cs"/>
                    </a:rPr>
                    <a:t>TESTING</a:t>
                </a:r>
            </a:p>

我把它放回到图纸文件夹并压缩了xlsx文件,但是当我打开xlsx文件时,图纸已损坏并被删除。所以我使用了diffchecker来确保这些xml文件中的其他内容都是相同的,并注意到Qt也对它进行了一次更改。

来自:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

为:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>

很好,无论如何,我将单引号编辑为双引号,现在差异检查器没有显示任何差异。我将此图形放回excel文件中并将其压缩,但是当我打开xlsx文件时,图形仍然被删除,因为它已损坏!

我认为编辑xml文件本身可能有问题,所以我尝试手动编辑drawing.xml文件。我做了之前显示的相同更改(只是&#34; TESTING&#34;并留下双引号),当我将其拉回到xlsx文件时没有问题!

我很困惑导致这个问题的原因是因为diff检查器显示xml文件之间没有差异,但是当我尝试将它们压缩成xlsx文件时,Qt以编程方式创建的文件是损坏的,而手编辑一个很好。可能是造成这个问题的原因是什么?

编辑:这是我正在运行的Qt代码:

QDomDocument doc;
QString temp;
int y, j;

QFile xml("C:/Users/dillo/Desktop/drawing2.xml");

if (!xml.open(QIODevice::ReadOnly)) {
    qDebug() << "file didnt open";
}

if (!doc.setContent(&xml, false, &temp, &y, &j)) {
    qDebug() << "Failed";
    qDebug() << temp << " " << y << " " << j;
}

QDomNodeList items = doc.elementsByTagName("a:r");

QDomNode node = items.at(1);
QDomNodeList children = node.childNodes();

QDomElement newNodeTag = doc.createElement(QString("a:t"));
QDomText newNodeText = doc.createTextNode(QString("TESTING"));
newNodeTag.appendChild(newNodeText);

node.replaceChild(newNodeTag, children.at(1));

xml.close();

xml.open(QIODevice::WriteOnly);
QTextStream stream(&xml);
stream << doc.toString();

xml.close();

0 个答案:

没有答案