XmlDocument doc = new XmlDocument();
doc.LoadXml(text);
//doc.LoadXml(richTextBox1.Text.Replace("\r\n", ""));
XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
xnm.AddNamespace("ns", doc.ChildNodes[1].Attributes["xmlns"].Value);
XmlNamespaceManager xnm_rd = new XmlNamespaceManager(doc.NameTable);
xnm_rd.AddNamespace("rd", doc.ChildNodes[1].Attributes["xmlns:rd"].Value);
XmlNode dsnode = doc.SelectSingleNode("/ns:Report/ns:DataSets/ns:DataSet", xnm);
XmlNode node = dsnode.SelectSingleNode("ns:Query", xnm);
string commandtext = node.SelectSingleNode("ns:CommandText", xnm).InnerText;
Dictionary<string, string> dic = new Dictionary<string, string>();
Dictionary<string, Field> diccolumns = new Dictionary<string, Field>();
foreach (XmlNode item in dsnode.SelectNodes("ns:Fields/ns:Field", xnm))
{
Field f = new Field();
f.DataField = item.SelectSingleNode("ns:DataField", xnm).InnerText;
f.TypeName = item.SelectSingleNode("rd:TypeName", xnm_rd).InnerText;
diccolumns.Add("Fields!" + item.Attributes["Name"].Value + ".Value", f);
}
foreach (XmlNode item in node.SelectNodes("//ns:QueryParameter", xnm))
{
dic.Add(item.Attributes["Name"].Value, item.SelectSingleNode("ns:Value", xnm).InnerText.Replace("=Parameters!", "").Replace(".Value", ""));
}
foreach (XmlNode item in filterdoc.SelectNodes("/Report/Params/Param"))
{
string name = item.SelectSingleNode("Name").InnerText;
string value = item.SelectSingleNode("Value").InnerText;
if (dic.ContainsKey("@" + name))
{
dic["@" + name] = value;
}
else if (dic.ContainsValue(name))
{
string key = dic.First(p => p.Value == name).Key;
dic[key] = value;
}
}
DataSet ds = new DataSet();
if (doc.GetElementsByTagName("CommandType").Count > 0)
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = commandtext;
comm.CommandType = System.Data.CommandType.StoredProcedure;
//傳值以及賦值
List<SqlParameter> spslist = new List<SqlParameter>();
foreach (var item in dic)
{
spslist.Add(new SqlParameter(item.Key, item.Value));
}
SqlParameter[] sps = spslist.ToArray();
comm.Parameters.AddRange(sps);
SqlDataAdapter da = new SqlDataAdapter(comm);
da.Fill(ds);
conn.Close();
}
else
{
foreach (var item in dic)
{
commandtext = commandtext.Replace(item.Key, "'" + (item.Value.IndexOf(",") > -1 ? string.Join("','", item.Value.Split(',')) : item.Value) + "'");
}
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(commandtext, conn);
//創建數據集對象(程序端的臨時數據庫)
//調用fill方法,填充數據集.(先去數據庫查詢結果集,並賦值給數據集)
da.Fill(ds);
//獲取數據集中第一張表
conn.Close();
}
DataTable dt = ds.Tables[0];
var filename = AppDomain.CurrentDomain.BaseDirectory + "\\" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
#region MyRegion
#endregion
sw.Stop();
writer.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " " + sw.ElapsedMilliseconds + ",Count:" + dt.Rows.Count);
writer.Flush();
//sw.Reset();
sw.Start();
#region aspose.cell
/*創建工作簿*/
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0]; //工作表
Cells cells = sheet.Cells;//單元格
int columnindex = 0;
int rowindex = 1;
XmlNode ReportSectionsNode = doc.SelectSingleNode("ns:Report/ns:ReportSections/ns:ReportSection", xnm);
#region 列寬度
XmlNode tabixBody = ReportSectionsNode.SelectSingleNode("ns:Body/ns:ReportItems/ns:Tablix/ns:TablixBody", xnm);
int columnCount = tabixBody.SelectNodes("ns:TablixColumns/ns:TablixColumn", xnm).Count;
for (int i = 0; i < columnCount; i++)
{
var columnNode = tabixBody.SelectNodes("ns:TablixColumns/ns:TablixColumn", xnm)[i];
XmlNode width = columnNode.SelectSingleNode("ns:Width", xnm);
if (width != null)
{
cells.SetColumnWidth(i, Convert.ToDouble(width.InnerText.Replace("mm", "").Replace("cm", "")) * 5);
}
}
#endregion
cells.Merge(0, 0, 1, columnCount);
#region 表頭
XmlNodeList headNodelist = ReportSectionsNode.SelectNodes("ns:Page/ns:PageHeader/ns:ReportItems/ns:Textbox", xnm);
foreach (XmlNode item in headNodelist)
{
XmlNode height = item.SelectSingleNode("ns:Height", xnm);
if (height != null)
{
double rate = height.InnerText.Contains("cm") ? 28 : 2.8;
cells.SetRowHeight(rowindex, Convert.ToDouble(height.InnerText.Replace("mm", "").Replace("cm", "")) * rate);
}
XmlNode textrun = item.SelectSingleNode("ns:Paragraphs/ns:Paragraph/ns:TextRuns/ns:TextRun", xnm);
Style styleTitle = workbook.Styles[workbook.Styles.Add()];//新增樣式
styleTitle.HorizontalAlignment = TextAlignmentType.Left;//文字居左
styleTitle.VerticalAlignment = TextAlignmentType.Center;
styleTitle.Pattern = BackgroundType.Solid;
styleTitle.BackgroundColor = Color.White;
XmlNode fontFamily = textrun.SelectSingleNode("ns:Style/ns:FontFamily", xnm);
if (fontFamily != null)
{
styleTitle.Font.Name = fontFamily.InnerText;//文字字體
}
XmlNode fontSize = textrun.SelectSingleNode("ns:Style/ns:FontSize", xnm);
if (fontSize != null)
{
styleTitle.Font.Size = Convert.ToInt32(fontSize.InnerText.Replace("pt", ""));//文字大小
}
XmlNode fontWeight = textrun.SelectSingleNode("ns:Style/ns:FontWeight", xnm);
if (fontWeight != null)
{
styleTitle.Font.IsBold = fontWeight.InnerText == "Bold" ? true : false;//粗體
}
string textvalue = textrun.SelectSingleNode("ns:Value", xnm).InnerText;
string headname = item.Attributes["Name"].Value;
switch (headname)
{
case "TitleBox":
filename = AppDomain.CurrentDomain.BaseDirectory + textvalue + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
putValue(cells, textvalue, rowindex, columnindex, styleTitle);
cells.Merge(1, 0, 1, columnCount);
break;
case "PageBox":
textvalue = "第1頁/共1頁 ";
styleTitle.HorizontalAlignment = TextAlignmentType.Right;//文字居左
putValue(cells, textvalue, rowindex, columnCount - 1, styleTitle);
cells.Merge(2, 0, 1, columnCount);
break;/**/
case "TodayBox":
foreach (XmlNode paramitem in filterdoc.SelectNodes("/Report/Params/Param"))
{
string name = paramitem.SelectSingleNode("DisplayName").InnerText;
if (textvalue.Contains(name))
{
textvalue = name + ":" + paramitem.SelectSingleNode("Value").InnerText;
}
}
putValue(cells, textvalue, rowindex, columnindex, styleTitle);
cells.Merge(3, 0, 1, columnCount);
break;
}
rowindex++;
}
#endregion
writer.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " head over");
writer.Flush();
int bindIndex = -1;
for (int rowitem = 0; rowitem < ReportSectionsNode.SelectNodes("ns:Body/ns:ReportItems/ns:Tablix/ns:TablixBody/ns:TablixRows/ns:TablixRow", xnm).Count; rowitem++)
{
var item = ReportSectionsNode.SelectNodes("ns:Body/ns:ReportItems/ns:Tablix/ns:TablixBody/ns:TablixRows/ns:TablixRow", xnm)[rowitem];
for (int i = 0; i < item.SelectNodes("ns:TablixCells/ns:TablixCell", xnm).Count; i++)
{
var cellitem = item.SelectNodes("ns:TablixCells/ns:TablixCell", xnm)[i];
Style styleTitle = workbook.Styles[workbook.Styles.Add()];//新增樣式
styleTitle.HorizontalAlignment = TextAlignmentType.Center;//文字居中
styleTitle.VerticalAlignment = TextAlignmentType.Center;
XmlNode textAlignNode = cellitem.SelectSingleNode("ns:CellContents/ns:Textbox/ns:Paragraphs/ns:Paragraph/ns:Style/ns:TextAlign",xnm);
if (textAlignNode != null)
{
switch (textAlignNode.InnerText)
{
case "Right":
styleTitle.HorizontalAlignment = TextAlignmentType.Right;
break;
case "Left":
styleTitle.HorizontalAlignment = TextAlignmentType.Left;
break;
}
}
styleTitle.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin; //應用邊界線 左邊界線
styleTitle.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin; //應用邊界線 右邊界線
styleTitle.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin; //應用邊界線 上邊界線
styleTitle.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;/**/ //應用邊界線 下邊界線
styleTitle.IsTextWrapped = true;//單元格內容自動換行
var colspannode = cellitem.SelectSingleNode("ns:CellContents/ns:ColSpan", xnm);
if (colspannode != null)
{
cells.Merge(rowindex, i, 1, Convert.ToInt32(colspannode.InnerText));
}
var cellstype = cellitem.SelectSingleNode("ns:CellContents/ns:Textbox/ns:Style/ns:BackgroundColor", xnm);
if (cellstype != null)
{
styleTitle.Pattern = BackgroundType.Solid;
//styleTitle.BackgroundColor = Color.FromName(cellstype.SelectSingleNode("ns:BackgroundColor", xnm).InnerText);
//styleTitle.BackgroundColor = ColorTranslator.FromHtml(cellstype.SelectSingleNode("ns:BackgroundColor", xnm).InnerText);
styleTitle.ForegroundColor = ColorTranslator.FromHtml(cellstype.InnerText);
}
string textvalue = "";
var textrun = cellitem.SelectSingleNode("ns:CellContents/ns:Textbox/ns:Paragraphs/ns:Paragraph/ns:TextRuns/ns:TextRun", xnm);
if (textrun != null)
{
textvalue = textrun.SelectSingleNode("ns:Value", xnm).InnerText;
if (bindIndex == rowitem)
{
Dictionary<int, CellStyle> fieldDic = new Dictionary<int, CellStyle>();
for (int j = 0; j < item.SelectNodes("ns:TablixCells/ns:TablixCell", xnm).Count; j++)
{
var columnCell = item.SelectNodes("ns:TablixCells/ns:TablixCell", xnm)[j];
textrun = columnCell.SelectSingleNode("ns:CellContents/ns:Textbox/ns:Paragraphs/ns:Paragraph/ns:TextRuns/ns:TextRun", xnm);
textvalue = textrun.SelectSingleNode("ns:Value", xnm).InnerText;
Style sy = workbook.Styles[workbook.Styles.Add()];
sy.Copy(styleTitle);
CellStyle cs = new CellStyle();
cs.Value = textvalue;
if (textvalue != "")
{
putFontStyle(sy, textrun, xnm);
}
cs.Style = sy;
XmlNode fontWeight = textrun.SelectSingleNode("ns:Style/ns:Format", xnm);
if (fontWeight != null)
{
cs.Format = fontWeight.InnerText;
}
XmlNode AlignNode = columnCell.SelectSingleNode("ns:CellContents/ns:Textbox/ns:Paragraphs/ns:Paragraph/ns:Style/ns:TextAlign", xnm);
if (AlignNode != null)
{
cs.TextAlign = AlignNode.InnerText;
}
fieldDic.Add(j, cs);
}
for (int row = 0; row < dt.Rows.Count; row++)
{
if (row % 10000 == 0)
{
writer.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " " + row + ":" + sw.ElapsedMilliseconds);
writer.Flush();
}
for (int j = 0; j < fieldDic.Keys.Count; j++)
{
textvalue = fieldDic[j].Value;
switch (fieldDic[j].TextAlign)
{
case "Right":
fieldDic[j].Style.HorizontalAlignment = TextAlignmentType.Right;
break;
case "Left":
fieldDic[j].Style.HorizontalAlignment = TextAlignmentType.Left;
break;
}
if (textvalue.Contains("=RowNumber"))
{
putValue(cells, row + 1, rowindex, j, fieldDic[j].Style);
}
else if (textvalue.Contains("=Fields!"))
{
try
{
textvalue = textvalue.Replace("=", "");
Field f = diccolumns[textvalue];
string value = dt.Rows[row][f.DataField].ToString();
if (!string.IsNullOrEmpty(value.ToString()))
{
object cell_value = "";
switch (f.TypeName)
{
case "System.DateTime":
cell_value=string.IsNullOrEmpty(fieldDic[j].Format) ? Convert.ToDateTime(value).ToString() : Convert.ToDateTime(value).ToString(fieldDic[j].Format);
break;
case "System.Decimal":
cell_value=string.IsNullOrEmpty(fieldDic[j].Format) ? Convert.ToDecimal(value) : Convert.ToDecimal(Convert.ToDecimal(value).ToString(fieldDic[j].Format));
break;
default:
cell_value = Convert.ChangeType(value, Type.GetType(f.TypeName));
break;
}
putValue(cells, cell_value, rowindex, j, fieldDic[j].Style);
}
else
{
putValue(cells, "", rowindex, j, fieldDic[j].Style);
}
}
catch
{
putValue(cells, textvalue, rowindex, j, fieldDic[j].Style);
}
}
else
{
putValue(cells, textvalue, rowindex, j, fieldDic[j].Style);
}
}
if (row != dt.Rows.Count - 1)
{
rowindex++;
}
}
break;
}
else if (textvalue != "")
{
putFontStyle(styleTitle, textrun, xnm);
//序號
if (textvalue.Contains("=RowNumber") || textvalue.Contains("=Fields!"))
{
if (bindIndex != rowitem)
{
bindIndex = rowitem;
rowitem--;
rowindex--;
break; ;
}
}
else if (textvalue.Contains("=Sum"))
{
try
{
string format = "";
decimal amount = 0m;
XmlNode fontWeight = textrun.SelectSingleNode("ns:Style/ns:Format", xnm);
textvalue = textvalue.Replace("=Sum(", "").Replace(")", "");
if (fontWeight != null)
{
format = fontWeight.InnerText;
}
if (!string.IsNullOrEmpty(format))
{
amount = dt.AsEnumerable().Where(d => d.Field<decimal?>(diccolumns[textvalue].DataField) != null).Select(d => Convert.ToDecimal(Convert.ToDecimal(d.Field<decimal>(diccolumns[textvalue].DataField)).ToString(format))).Sum();
}
else
{
amount = dt.AsEnumerable().Where(d => d.Field<decimal?>(diccolumns[textvalue].DataField) != null).Select(d => Convert.ToDecimal(d.Field<decimal>(diccolumns[textvalue].DataField))).Sum();
}
putValue(cells, amount, rowindex, i, styleTitle);
}
catch
{
putValue(cells, textvalue, rowindex, i, styleTitle);
}
}
else
{
putValue(cells, textvalue, rowindex, i, styleTitle);
}
}
else
{
putValue(cells, textvalue, rowindex, i, styleTitle);
}
}
else
{
putValue(cells, textvalue, rowindex, i, styleTitle);
}
}
rowindex++;
}
//sheet.AutoFitRows();
workbook.Save(filename);
writer.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " " + sw.ElapsedMilliseconds + " Save over");
writer.Flush();
#endregion
sw.Stop();
writer.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " " + sw.ElapsedMilliseconds + " 完成");
writer.WriteLine("--------------------------------分割線--------------------------------");
writer.Flush();
writer.Close();