excel变成xml格式_XML文件

excel变成xml格式_XML文件最近做了一个小工具,可以将XML和Excel之前互转。里面用到的XML读写库是tinyxml,在Excel2010上运行,请先确保装了Excel,而不是WPS。代码写的比较挫,一大坨,最近忙也懒得去做优化了。github地址:XML与Excel互转工具目前只支持ANSI格式的Excel文件与ANSI格式的XML文件互转。由于在写的时候,里面的存储方式都是CString,默认为ANS

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近做了一个小工具,可以将XML和Excel之前互转。

里面用到的XML读写库是tinyxml,在Excel2010上运行,请先确保装了Excel,而不是WPS。

代码写的比较挫,一大坨,最近忙也懒得去做优化了。

github地址:XML与Excel互转工具

目前只支持ANSI格式的Excel文件与ANSI格式的XML文件互转。由于在写的时候,里面的存储方式都是CString,默认为ANSI格式,所以哪怕里面把文字转成了UTF8,再保存到CString中也还是被认为是ANSI,这时候就会出现乱码,接下来如果有时间我会把这个问题修复。

直接讲讲代码吧。

读写xml,调用的是tinyxml的接口,核心部分代码都在这下面了,比较挫,分享给大家,希望有帮助。

/*分表和总表模式XML转Excel*/
void CReadXlsDlg::OnBnClickedButton3()
{
// TODO:  在此添加控件通知处理程序代码
// TODO:  在此添加控件通知处理程序代码
CString strInputFile;
CString strOutputPath;
strInputFile.Empty();
strOutputPath.Empty();
m_editInputPath.GetWindowTextW(strInputFile);
m_editOutputPath.GetWindowTextW(strOutputPath);
//strInputFile = "C:\\Users\\linzhaolun.allen\\Desktop\\a.xml";
//strOutputPath = "C:\\Users\\linzhaolun.allen\\Desktop\\b.xls";
if (0 == strInputFile.GetLength())
{
MessageBox(_T("请先选择需要读取的文件"), _T("错误"), MB_OK);
return;
}
if (0 == strOutputPath.GetLength())
{
MessageBox(_T("请先选择输出路径"), _T("错误"), MB_OK);
return;
}
vector<vector<CString>> vecSheet;
CSheetSize SheetSize;
TiXmlDocument *doc = new TiXmlDocument(__CString2Constchar(strInputFile));
if (!doc->LoadFile(TIXML_ENCODING_UTF8))  //判断XML文件是否加载成功
{
MessageBox(_T("无法打开该文件"), _T("错误"), MB_OK);
return;
}
//doc->Parse(xmlParament,0,TIXML_ENCODING_UTF8);
//目前仅支持合表模式xml的解析
int BoHaveTitle = false;
TiXmlElement* RootLayersNestedElement = doc->RootElement();
if (NULL == RootLayersNestedElement) //判断文件是否有内容
{
MessageBox(_T("没有root element"), _T("错误"), MB_OK);
return;
}
//cout << doc->Value() << endl;
m_stroutputName = RootLayersNestedElement->Value();       //每个xml的root保存为文件名
//cout << m_stroutputName << endl;
m_mapSheetList.erase(m_mapSheetList.begin(), m_mapSheetList.end()); //注意使用map前对其进行清空
m_mapSheetSize.erase(m_mapSheetSize.begin(), m_mapSheetSize.end());
m_vecSheetName.clear();
TiXmlElement* TwoLayersNestedElement = RootLayersNestedElement->FirstChildElement();   //第二层嵌套
int nSheetCount =0;
for (; TwoLayersNestedElement != NULL; TwoLayersNestedElement = TwoLayersNestedElement->NextSiblingElement()) 
{  //每一层循环代表一个sheet
CString strSheetName;
CString strSpecialSheetPrefix("xxxxx");
CString strList("List");
//CString strConnectSheetAndAtti("yyyyy");
vector<CString> sub_vecSheetName;  
vector<CString>::iterator it;
map<CString, CExcelSheet> sub_mapSheetList;
strSheetName = TwoLayersNestedElement->Value();//获取sheet名
//cout << strSheetName << endl;
TiXmlElement* ThreeLayersNestedElement = TwoLayersNestedElement->FirstChildElement();  //第三层嵌套 
if (TwoLayersNestedElement->FirstAttribute())
{
strSheetName = strSpecialSheetPrefix + strSheetName + strList;
ThreeLayersNestedElement = TwoLayersNestedElement;
}
if (TwoLayersNestedElement->Value() != ThreeLayersNestedElement->Value())
{
//CString tempStr(ThreeLayersNestedElement->Value());
//strSheetName = strSheetName + strConnectSheetAndAtti + tempStr;
//MessageBox(_T("item和list之间命名规范错误!list名=item名+“list"), _T("错误"), MB_OK);
//return;
}
for (; ThreeLayersNestedElement != NULL; ThreeLayersNestedElement = ThreeLayersNestedElement->NextSiblingElement())
{	
if (ThreeLayersNestedElement->FirstChildElement() && ThreeLayersNestedElement->FirstChildElement()->FirstChildElement())
{
TiXmlElement* FourLayersNestedElement = ThreeLayersNestedElement->FirstChildElement();  //第四层嵌套,相当于分表的Excel总表的展开,每一个为一个新的sheet,这个sheet的第一列,包含总是包含第三层的ID号作为索引
//第五层嵌套,新的sheet里面的每一项
for (; FourLayersNestedElement != NULL; FourLayersNestedElement = FourLayersNestedElement->NextSiblingElement())//每一个循环意味着创建一个新的分表
{
CExcelSheet asheet;
asheet.BoHaveTitle = false;
asheet.strSheetName = FourLayersNestedElement->Value();//获取sheet名
/*在vec中已经存在该sheet名,也就是之前已经有分表出现过了,此时要做的是把获得的数据push到之前的表内*/
it = find(sub_vecSheetName.begin(), sub_vecSheetName.end(), asheet.strSheetName);
if (it != sub_vecSheetName.end())
{
asheet = sub_mapSheetList[asheet.strSheetName];
}
vector<CString> vecSubRow, vecSubTitle;	
vecSubTitle.push_back(__Constchar2CString(ConvertUtf8ToAnsi(ThreeLayersNestedElement->FirstAttribute()->Name())));
vecSubRow.push_back(__Constchar2CString(ConvertUtf8ToAnsi(ThreeLayersNestedElement->FirstAttribute()->Value())));
TiXmlElement* FiveLayersNestedElement = FourLayersNestedElement->FirstChildElement();
for (; FiveLayersNestedElement != NULL; FiveLayersNestedElement = FiveLayersNestedElement->NextSiblingElement())
{
TiXmlAttribute* attributeOfFivelayers = FiveLayersNestedElement->FirstAttribute();  //获得属性 
for (; attributeOfFivelayers != NULL; attributeOfFivelayers = attributeOfFivelayers->Next())
{
vecSubTitle.push_back(__Constchar2CString(ConvertUtf8ToAnsi(attributeOfFivelayers->Name())));
vecSubRow.push_back(__Constchar2CString(ConvertUtf8ToAnsi(attributeOfFivelayers->Value())));
}
if (!asheet.BoHaveTitle){
asheet.BoHaveTitle = true;
asheet.vecSheet.push_back(vecSubTitle);
vecSubTitle.clear();
asheet.vecSheet.push_back(vecSubTitle);
//SheetSize.row++;
}
asheet.vecSheet.push_back(vecSubRow);
vecSubRow.clear();
vecSubRow.push_back(__Constchar2CString(ConvertUtf8ToAnsi(ThreeLayersNestedElement->FirstAttribute()->Value())));
it = find(sub_vecSheetName.begin(), sub_vecSheetName.end(), asheet.strSheetName);
if (it == sub_vecSheetName.end())
{
sub_vecSheetName.push_back(asheet.strSheetName);
}
sub_mapSheetList[asheet.strSheetName] = asheet;			
}						
}
}
TiXmlAttribute* attributeOfThreelayers = ThreeLayersNestedElement->FirstAttribute();  //获得属性  
vector<CString> vecRow, vecTitle;
//SheetSize.row = SheetSize.col = 0;
for (; attributeOfThreelayers != NULL; attributeOfThreelayers = attributeOfThreelayers->Next())
{
//cout << attributeOfThreelayers->Name() << ":" << attributeOfThreelayers->Value() << endl;
vecTitle.push_back(__Constchar2CString(ConvertUtf8ToAnsi(attributeOfThreelayers->Name())));
vecRow.push_back(__Constchar2CString(ConvertUtf8ToAnsi(attributeOfThreelayers->Value())));
//SheetSize.col++;
}
if (!BoHaveTitle){
BoHaveTitle = true;
vecSheet.push_back(vecTitle);
vecTitle.clear();
vecSheet.push_back(vecTitle);
//SheetSize.row++;
}
vecSheet.push_back(vecRow);
//SheetSize.row++;
}
BoHaveTitle = false;
m_mapSheetList[strSheetName] = vecSheet;
//m_mapSheetSize[strSheetName] = SheetSize;
m_vecSheetName.push_back(strSheetName);
for (int i = 0; i < sub_vecSheetName.size(); i++)
{
m_vecSheetName.push_back(sub_vecSheetName[i]);
m_mapSheetList[sub_vecSheetName[i]] = sub_mapSheetList[sub_vecSheetName[i]].vecSheet;
}
nSheetCount++;
vecSheet.clear();
sub_mapSheetList.erase(sub_mapSheetList.begin(), sub_mapSheetList.end()); //注意使用map前对其进行清空
sub_vecSheetName.clear();
}
//将m_mapSheetList内容写入xls文件
LPDISPATCH lpDisp = NULL;
if (!m_obExcel.open(__CString2Constchar(strOutputPath)))
{
MessageBox(_T("无法打开该文件"), _T("错误"), MB_OK);
return;
}
for (int i = m_vecSheetName.size()-1; i >=0 ; i--)
{
CString strSheetName = m_vecSheetName[i];
if (!m_obExcel.addNewSheet(strSheetName))
{
MessageBox(_T("无法新建sheet"), _T("错误"), MB_OK);
return;
}
try{
m_obExcel.useSheet(strSheetName);
}
catch(...)
{
MessageBox(_T("无法使用指定sheet:")+strSheetName, _T("错误"), MB_OK);
return;
}
vector<vector<CString>> vecTempSheet;
vecTempSheet = m_mapSheetList[strSheetName];
for(int tempRow=0; tempRow < vecTempSheet.size(); tempRow++)
{
vector<CString> vecTempRow;
vecTempRow = vecTempSheet[tempRow];
for(int tempCol=0; tempCol < vecTempRow.size(); tempCol++)
{
CString tempCell;
tempCell = vecTempRow[tempCol];
try{
m_obExcel.setCellString(tempRow + 1, tempCol + 1, tempCell);
}
catch(...)
{
MessageBox(_T("无法使用写入cell,可能是坐标错误"), _T("错误"), MB_OK);
return;
}
}
}
}
m_obExcel.deleteSheet(__Constchar2CString("Sheet1"));
m_obExcel.deleteSheet(__Constchar2CString("Sheet2"));
m_obExcel.deleteSheet(__Constchar2CString("Sheet3"));
m_obExcel.saveAsXLSFile(strOutputPath);  //此时生成的xls内为Ansi格式字符,xls再次转回XML时会被转码成为UTF-8
m_obExcel.close();
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171944.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • MySQL窗口函数【转载】[通俗易懂]

    MySQL窗口函数【转载】[通俗易懂]注意MySQL窗口函数是8.0及以后才有的新特性。安装mysql8.0(docker安装方式)安装docker安装docker#下载指定版本dockerwgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo-O/etc/yum.repos.d/docker-ce.repo#安装dockeryum-yinstalldocker-ce-18.06.1.ce-3.el7#开启docke.

  • 金融大数据平台建设_智慧银行数字化运营大赛

    金融大数据平台建设_智慧银行数字化运营大赛来源:方案经理选编:秀方案网https://www.fangan100.com/fangan/1213.html互联网金融的本质是金融,核心是数据,载体是平台,关键是客户体验,发展趋势是互联网与金融的深度融合,要提升大数据贡献度。探索银行业务创新,实现数据资源的综合应用、深度应用,已成为提升企业核心竞争力,实现企业信息化可持续发展的关键途径。大数据技术在银行业的应用范围包括:客户洞察、营销…

  • 高德地图实现多点标注marker和动态信息窗体[通俗易懂]

    高德地图实现多点标注marker和动态信息窗体[通俗易懂]先说一下项目对地图的需求:在后台新增地图管理模块,要求,每一辆车都在地图上有标注,而且点击标注时要显示出车辆的相关信息,比如车牌和车辆的当前状态。下图就是实现的效果。当然从高德地图api也能查看到这一块,比如多点标注,简单信息窗体,这些都有api,可以先看官网的,然后,再看我这篇文章,怎么融合一起,记住数据全部来自后台数据库,这样才能保证一切数据都是动态的,可实时更新的。首

  • 经济基础知识(中级)【2】

    经济基础知识(中级)【2】1.下列经济活动中,会导致企业现金流入的有()。A.购买原材料B.用固定资产对外投资C.对外投资D.收到银行贷款E.销售商品2.下列义务中,属于公司股东法定义务的有()。A.遵守公司章程B.缴纳所认缴的出资C.忠实义务D.勤勉义务E.公司设立登记后,不得抽回出资3.会计确认应该符合一定的标准,企业在确认收入时应当坚持的标准有()。A.及时确认B.取得收入权利的交易已经发生C.按照权责发生制要求进行确认D.取得资产所有权的交易已经发生E.年底统一确认4.下列统计

  • 二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解

    二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解0.写在最前面希望大家收藏:本文持续更新地址:https://haoqchen.site/2018/05/23/go-through-binary-tree/    复习到二叉树,看到网上诸多博客文章各种绕,记得头晕。个人觉得数学、算法这些东西都是可以更直观简洁地表示,然后被记住的,并不需要靠死记硬背。本文的程序基本来源于《大话数据结构》,个人感觉是一本非常好的书,推荐去看。…

  • shell脚本编程100例pdf_linux基础命令表

    shell脚本编程100例pdf_linux基础命令表https://blog.csdn.net/yugemengjing/article/details/82469785https://blog.csdn.net/yugemengjing/article/details/824697851、编写helloworld脚本#!/bin/bash#编写helloworld脚本echo”HelloWorld!”2、通过位置变…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号