经过查找资料,关于操作word不依赖微软环境,有两种方法,两种方法得到的字符串都需要gb2312与utf相互转换:
1、Duck
using namespace duckx;
duckx::Document doc("file.docx");
doc.open();
//获取当前word中所有的表格
for (auto p = doc.tables(); p.has_next(); p.next())
{
//获取所有行
for (auto r = p.rows(); r.has_next(); r.next())
{
//获取所有列的数据
for (auto r1 = r.cells(); r1.has_next(); r1.next())
{
for (auto r2 = r1.paragraphs(); r2.has_next(); r2.next())
{
for (auto r3 = r2.runs(); r3.has_next(); r3.next())
{
std::string strText = r3.get_text();
std::string str1 = UTF8ToGB2312(strText);
int yy = 55;
}
}
}
}
}
//读取当前word里面普通的内容
for (auto _doc = doc.paragraphs(); _doc.has_next(); _doc.next())
{
for (auto r = _doc.runs(); r.has_next(); r.next())
{
std::string strText = r.get_text();
std::string str1 = UTF8ToGB2312(strText);
}
}
2、DocxFactory 偏重于操作word模板,通过中间文件dfw来操作
//这个库使用步骤如下:
//(1)创建word模板文件,创建field字段,可多个,然后创建【书签】 每个书签可以包含多个field
//(2)根据setClipboardValue设置当前的field数值 然后paste 改变当前书签的数值
//设置当前的工作目录
string strTemp = "C:\\Users\\Administrator\\Desktop\\DocxFactory\\temp";
WordProcessingMerger::getInstance().setTempDir(strTemp);
WordProcessingCompiler::getInstance().setTempDir(strTemp);
//生成file.dfw的文件
WordProcessingCompiler::getInstance().compile("file.docx", WordProcessingCompiler::getInstance().getTempDir());
//加载文件
WordProcessingMerger::getInstance().load(WordProcessingCompiler::getInstance().getTempDir() + "\\file.dfw");
WordProcessingMerger::getInstance().setClipboardValue("item1", "fields1", GB2312ToUTF8("测试"));
WordProcessingMerger::getInstance().setClipboardValue("item1", "fields2", 33.55);
WordProcessingMerger::getInstance().paste("item1");
WordProcessingMerger::getInstance().save("file1.docx");
WordProcessingMerger::getInstance().close();