WIN32 下读取excel文档
来源:互联网 发布:卡密软件破解 编辑:程序博客网 时间:2024/06/06 05:12
1、将excel另存为xml文档,
在office下:
wps下另存为:
2、采用libxml2解析xml数据:
xmlDocPtr doc;xmlNodePtr cur;//doc = xmlParseFile(&file_name[0]);doc = xmlReadFile(&file_name[0], NULL,XML_PARSE_NOBLANKS);if (doc == NULL ) {fprintf(stderr,"Document not parsed successfully. \n");return FALSE;}cur = xmlDocGetRootElement(doc);if (cur == NULL) {fprintf(stderr,"empty document\n");xmlFreeDoc(doc);return FALSE;}
//文件根元素为Workbookif (xmlStrcmp(cur->name, (const xmlChar *) "Workbook")) {fprintf(stderr,"document of the wrong type, root node != story");xmlFreeDoc(doc);return FALSE;}
//找到Worksheet子节点cur = cur->xmlChildrenNode;
while (cur != NULL) {if ((!xmlStrcmp(cur->name, (const xmlChar *)"Worksheet"))){//parseStory (doc, cur);break;}cur = cur->next;} //Worksheet的两次子节点到Table元素cur = cur->children;cur = cur->children;if(!cur){xmlFreeDoc(doc);return FALSE;} //找到行开始元素while(cur){if (!xmlStrcmp(cur->name, (const xmlChar*)"Row")){break;}//printf(" ");//printf((char*)cur->name);cur = cur->next;}
//这里找到所要的行,作为例子,这里为第三行int i;for(i = 0; i < 3 && cur; i++){cur = cur->next;//printf(" ");//printf((char*)cur->name);}int count = 0;while(cur){ xmlNodePtr cell;cell = cur->children;//printf("\n");if(!cell){break;}
//假设有8列for(i = 0; i< 8; i++){xmlNodePtr data;xmlChar* content;xmlChar* index;if (!cell){ break;}
//有数据的列起始位置,也就是前面的cell里如何没有数据,那么是无需存储的index = xmlGetProp(cell, (const xmlChar*)"Index");if(index){i = atoi((char*)index)-1;xmlFree(index);}data = cell->children;if(data){
//处理相关数据content = xmlNodeGetContent(cell);switch(i){case 0:break;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;case 7:break;case 8: break;default:break;}}else{
//一整行没有数据,认为已经读完,当然也可以让程序循环到row的兄弟节点为NULL,则为结束if(i == 0){file_finished = 1;break;}}cell = cell->next;}if(file_finished){break;}cur = cur->next;count++;}
//释放内存xmlFreeDoc(doc);
3、excel文件格式说明:第一部分:文件说明。包括作者、创建日期、修改日期、xml名空间等。
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>Administrator</Author> <Created>2016-11-16T06:31:00Z</Created> <LastSaved>2016-11-29T14:31:27Z</LastSaved> </DocumentProperties> <CustomDocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <KSOProductBuildVer dt:dt="string">2052-10.1.0.6065</KSOProductBuildVer> </CustomDocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowWidth>19095</WindowWidth> <WindowHeight>8850</WindowHeight> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook>
第二部分:excel的单元格格式说明<Styles> <Style ss:ID="s33" ss:Name="20% - 强调文字颜色 5"> <Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000"/> <Interior ss:Color="#D9E1F2" ss:Pattern="Solid"/> </Style> <Style ss:ID="s31" ss:Name="好"> <Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#006100"/> <Interior ss:Color="#C6EFCE" ss:Pattern="Solid"/> </Style> <Style ss:ID="s2" ss:Name="20% - 强调文字颜色 3"> <Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000"/> <Interior ss:Color="#EDEDED" ss:Pattern="Solid"/> </Style> <Style ss:ID="s8" ss:Name="千位分隔"> <NumberFormat ss:Format="_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * "-"??_ ;_ @_ "/> </Style> <Style ss:ID="s44" ss:Name="40% - 强调文字颜色 5"> <Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#000000"/> <Interior ss:Color="#B4C6E7" ss:Pattern="Solid"/> </Style> <Style ss:ID="s18" ss:Name="解释性文本"> <Font ss:FontName="宋体" x:CharSet="0" ss:Size="11" ss:Color="#7F7F7F" ss:Italic="1"/> </Style>
<Styles>这里仅为举例,其实格式说明很多,包括单元字体、边框、字体颜色等等。第三部分:单元格数据,首先是表格列属性说明,紧接着是每一行的数据,这里仅列举部分。 <Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="254" ss:ExpandedRowCount="67" x:FullColumns="1" x:FullRows="1" ss:StyleID="s53" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5"> <Column ss:Index="1" ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="45"/> <Column ss:Index="2" ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="53.25"/> <Column ss:StyleID="s50" ss:AutoFitWidth="0" ss:Width="31.5"/> <Column ss:StyleID="s50" ss:AutoFitWidth="0" ss:Width="33.75"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="30"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="30.75"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="33"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="32.25"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="36.75"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="35.25"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="33.75"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="35.25"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="30.75"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="54.75"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="27" ss:Span="1"/> <Column ss:Index="17" ss:StyleID="s50" ss:AutoFitWidth="0" ss:Width="33"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="29.25"/> <Column ss:StyleID="s53" ss:AutoFitWidth="0" ss:Width="44.25"/> <Column ss:StyleID="s54" ss:AutoFitWidth="0" ss:Width="200.25"/> <Column ss:StyleID="s50" ss:Span="233"/> <Row ss:StyleID="s50" ss:Height="41.1"> <Cell ss:StyleID="s94" ss:MergeAcross="19"> <Data ss:Type="String"> this is cell data</Data> </Cell> </Row> <Row ss:StyleID="s51" ss:Height="33.95"> <Cell ss:Index="5" ss:StyleID="s63">ss:StyleID <Data ss:Type="String">just</Data> </Cell> <Cell ss:StyleID="s60"> <Data ss:Type="String"> shi </Data> </Cell> </Row>//从第5个单元格开始才有数据,ss:名空间,单元格格式:编号为s63的好了,介绍到这,仅抛砖引玉,如有疏漏之处,欢迎指正,谢谢!
0 0
- WIN32 下读取excel文档
- java 读取Excel文档
- PIO读取excel文档
- PHP读取excel文档
- win32 导入excel文档模板,写入数据
- jxl API 读取Excel文档
- JS读取Excel文档记录
- Java读取Excel文档总结
- js操作读取excel文档
- 读取加密的excel文档
- js操作读取excel文档
- Win32环境下的ini文件读取
- Win32环境下的ini文件读取
- Win32环境下的ini文件读取
- 利用Java 创建和读取Excel文档
- 利用Java 创建和读取Excel文档
- 利用Java 创建和读取Excel文档
- 利用Java 创建和读取Excel文档
- Django学习笔记
- Android 使用SharePerference实现判断是否为第一次登陆
- OpenGL(一) OpenGL管线 与 可编程管线流程
- 如何让存储到数据库的数据是完整的?
- VS使用技巧(快捷键)
- WIN32 下读取excel文档
- meta-http 属性详情
- ArcGIS Python API 与R语言混合编程实现分析及可视化
- 快速排序
- arcgis for android 和百度地图共同使用出现的问题
- Linux监控工具vmstat命令详解
- shell 脚本中字符的自增
- 两分钟配置yum源&&yum命令详解
- Android--UI