Aspose.Cell導出Excel

            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();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章