您的位置:首页 > 其它

动态解析XML生成EXCEL

2013-02-13 14:20 441 查看
在做项目中,可能会遇到这样的需求,根据数据库里的数据生成相应格式Excel表格。生成的Excel表格不是常规的表格,而是存在合并,宽度不一,长短不一这种需求的。

类似于下面的图表:

View Code

View Code

//要转换的XML文件
creatXML();
string XMLFileName = Path.Combine(Request.PhysicalApplicationPath, "XML\\document.xml");
DataSet dsBook = new DataSet();
dsBook.ReadXml(XMLFileName);
int rows = dsBook.Tables[0].Rows.Count + 1;
int cols = 7;

//将要生成的Excel文件
string ExcelFileName = Path.Combine(Request.PhysicalApplicationPath, "XML\\DMSExcel.xls");
if (File.Exists(ExcelFileName))
{
File.Delete(ExcelFileName);
}
StreamWriter writer = new StreamWriter(ExcelFileName, false);
writer.WriteLine("<?xml version=\"1.0\"?>");
writer.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>");
writer.WriteLine("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
writer.WriteLine(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
writer.WriteLine(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
writer.WriteLine(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
writer.WriteLine(" xmlns:html=\"http://www.w3.org/TR/REC-html40/\">");
writer.WriteLine(" <DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">");
writer.WriteLine("  <Author>Automated Report Generator Example</Author>");
writer.WriteLine(string.Format("  <Created>{0}T{1}Z</Created>", DateTime.Now.ToString("yyyy-mm-dd"), DateTime.Now.ToString("HH:MM:SS")));
writer.WriteLine("  <Company>Your Company Here</Company>");
writer.WriteLine("  <Version>11.6408</Version>");
writer.WriteLine(" </DocumentProperties>");
writer.WriteLine(" <ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">");
writer.WriteLine("  <WindowHeight>8955</WindowHeight>");
writer.WriteLine("  <WindowWidth>11355</WindowWidth>");
writer.WriteLine("  <WindowTopX>480</WindowTopX>");
writer.WriteLine("  <WindowTopY>15</WindowTopY>");
writer.WriteLine("  <ProtectStructure>False</ProtectStructure>");
writer.WriteLine("  <ProtectWindows>False</ProtectWindows>");
writer.WriteLine(" </ExcelWorkbook>");
writer.WriteLine(" <Styles>");
writer.WriteLine("  <Style ss:ID=\"Default\" ss:Name=\"Normal\">");
writer.WriteLine("   <Alignment ss:Vertical=\"Bottom\"/>");
writer.WriteLine("   <Borders/>");
writer.WriteLine("   <Font/>");
writer.WriteLine("   <Interior/>");
writer.WriteLine("   <Protection/>");
writer.WriteLine("  </Style>");
writer.WriteLine("  <Style ss:ID=\"s21\">");
writer.WriteLine("   <Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\" ss:WrapText=\"1\"/>");
writer.WriteLine("   <Interior ss:Pattern=\"Solid\"/>");
writer.WriteLine("   <Borders>");
writer.WriteLine("    <Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("    <Border ss:Position=\"Left\" ss:LineStyle=\"Continuous\"  ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("    <Border ss:Position=\"Right\" ss:LineStyle=\"Continuous\"  ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("    <Border ss:Position=\"Top\" ss:LineStyle=\"Continuous\"  ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("   </Borders>");
writer.WriteLine("  </Style>");

writer.WriteLine("  <Style ss:ID=\"header\">");
writer.WriteLine("   <Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\" ss:WrapText=\"1\"/>");
writer.WriteLine("   <Interior ss:Color=\"#00FFFF\" ss:Pattern=\"Solid\"/>");
writer.WriteLine("   <Borders>");
writer.WriteLine("    <Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("    <Border ss:Position=\"Left\" ss:LineStyle=\"Continuous\"  ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("    <Border ss:Position=\"Right\" ss:LineStyle=\"Continuous\"  ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("    <Border ss:Position=\"Top\" ss:LineStyle=\"Continuous\"  ss:Color=\"#0000FF\" ss:Weight=\"1\"/>");
writer.WriteLine("   </Borders>");
writer.WriteLine("  </Style>");
writer.WriteLine(" </Styles>");

writer.WriteLine(" <Worksheet ss:Name=\"MyReport\">");

writer.WriteLine(string.Format("  <Table ss:ExpandedColumnCount=\"9\" ss:ExpandedRowCount=\"{0}\" x:FullColumns=\"1\"",rows.ToString()));
writer.WriteLine("   x:FullRows=\"1\">");
//生成标题
writer.WriteLine("<Column ss:Index=\"1\" ss:Width=\"147.00\"/>");
writer.WriteLine("<Column ss:Index=\"2\" ss:Width=\"72.00\"/>");
writer.WriteLine("<Column ss:Index=\"3\" ss:Width=\"42.89\"/>");
writer.WriteLine("<Column ss:Index=\"4\" ss:Width=\"42.89\"/>");
writer.WriteLine("<Column ss:Index=\"5\" ss:Width=\"42.89\"/>");
writer.WriteLine("<Column ss:Index=\"6\" ss:Width=\"48.25\"/>");
writer.WriteLine("<Column ss:Index=\"7\" ss:Width=\"21.44\"/>");
writer.WriteLine("<Column ss:Index=\"8\" ss:Width=\"21.44\"/>");
writer.WriteLine("<Column ss:Index=\"9\" ss:Width=\"21.44\"/>");
writer.WriteLine("<Row ss:Height=\"141.00\">");
string[] strDocumentTitle=new string[9];
int i = 0;
foreach (DataColumn eachCloumn in dsBook.Tables[0].Columns)
{
string strTemp = eachCloumn.ColumnName.ToString();
strDocumentTitle[i] = strTemp;
i++;
}
writer.Write("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">");
writer.Write(strDocumentTitle[0]);
writer.WriteLine("</Data></Cell>");

writer.Write("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">");
writer.Write(strDocumentTitle[1]);
writer.WriteLine("</Data></Cell>");

writer.Write("<Cell ss:StyleID=\"header\" ss:MergeAcross=\"2\"><Data ss:Type=\"String\">");
writer.Write(strDocumentTitle[2]);
writer.WriteLine("</Data></Cell>");

writer.Write("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">");
writer.Write(strDocumentTitle[5]);
writer.WriteLine("</Data></Cell>");

writer.Write("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">");
writer.Write(strDocumentTitle[6]);
writer.WriteLine("</Data></Cell>");

writer.Write("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">");
writer.Write(strDocumentTitle[7]);
writer.WriteLine("</Data></Cell>");

writer.Write("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">");
writer.Write(strDocumentTitle[8]);
writer.WriteLine("</Data></Cell>");

writer.WriteLine("</Row>");

//生成数据记录
foreach (DataRow eachRow in dsBook.Tables[0].Rows)
{
writer.WriteLine("<Row ss:Height=\"24.00\">");
for (int currentRow = 0; currentRow != 9; currentRow++)
{
writer.Write("<Cell ss:StyleID=\"s21\"><Data ss:Type=\"String\">");
writer.Write(eachRow[currentRow].ToString());
writer.WriteLine("</Data></Cell>");
}
writer.WriteLine("</Row>");
}
writer.WriteLine("  </Table>");
writer.WriteLine("  <WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
writer.WriteLine("   <Selected/>");
writer.WriteLine("   <Panes>");
writer.WriteLine("    <Pane>");
writer.WriteLine("     <Number>3</Number>");
writer.WriteLine("     <ActiveRow>1</ActiveRow>");
writer.WriteLine("    </Pane>");
writer.WriteLine("   </Panes>");
writer.WriteLine("   <ProtectObjects>False</ProtectObjects>");
writer.WriteLine("   <ProtectScenarios>False</ProtectScenarios>");
writer.WriteLine("  </WorksheetOptions>");
writer.WriteLine(" </Worksheet>");
writer.WriteLine(" <Worksheet ss:Name=\"Sheet2\">");
writer.WriteLine("  <WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
writer.WriteLine("   <ProtectObjects>False</ProtectObjects>");
writer.WriteLine("   <ProtectScenarios>False</ProtectScenarios>");
writer.WriteLine("  </WorksheetOptions>");
writer.WriteLine(" </Worksheet>");
writer.WriteLine(" <Worksheet ss:Name=\"Sheet3\">");
writer.WriteLine("  <WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
writer.WriteLine("   <ProtectObjects>False</ProtectObjects>");
writer.WriteLine("   <ProtectScenarios>False</ProtectScenarios>");
writer.WriteLine("  </WorksheetOptions>");
writer.WriteLine(" </Worksheet>");
writer.WriteLine("</Workbook>");
writer.Close();


这个代码只是一种思想,根据XML生成相应的EXCEL关键是设计结构。至于解析数据,学过编程的都会。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: