当前位置:编程学习 > C#/ASP.NET >>

求大神来帮忙看看,导出不规则的Excel




求各位大神帮忙看看,在一个表里面的数据分为等级,PID = -1 的是最上级,通过typeid来区分上下级,导出的事要想图里那样,我是实在弄不出来了,几天了,求大神解答,真心感谢了 --------------------编程问答--------------------

//先添加引用:Microsoft.Office.Interop.Excel
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;

static class Program
{
static void Main()
{
string[] cols = { "id", "classes", "typeID", "pID", "typeName", "typeLevel", "sortID" };
var dt = new DataTable();
dt.Columns.AddRange(cols.Select(c=>new DataColumn(c)).ToArray());
var testRows = new List<object[]>
{
new object[] {1, 1, 1001, -1, "1", 1, 1},
new object[] {5, 1, 2001, -1, "2", 1, 1},
new object[] {6, 1, 3001, -1, "3", 1, 1},
new object[] {7, 1, 4001, -1, "4", 1, 1},
new object[] {2, 1, 1002, 1001, "11", 1, 1},
new object[] {3, 1, 1003, 1002, "111", 1, 1},
new object[] {4, 1, 1004, 1002, "111", 1, 1},
new object[] {9, 1, 1005, 1002, "111", 1, 1},
new object[] {10, 1, 1006, 1002, "111", 1, 1},
};
testRows.ForEach(r=>dt.Rows.Add(r));

Func<DataRow, DataRow[]> children, descendants = null;
children = r => dt.Select("pID=" + r["typeID"], "sortID");
descendants = r => children(r).SelectMany(r1 => new[]{r1}.Union(descendants(r1))).ToArray();

var excel = new Excel.Application();
Excel.Workbook book = excel.Workbooks.Add();
Excel.Worksheet sheet = book.Worksheets[1];

Func<int, char> colName = c => (char) ('A' + c - 1);
Action<DataRow[], int, int> exportRows = null;
exportRows = (dataRows, row, col) =>
{
foreach (var dr in dataRows)
{
sheet.Cells[row, col].Value = dr["typeName"];
var lines = descendants(dr).Count(r => children(r).Length == 0);
if (lines > 1)
{
string range = string.Format("{0}{1}:{0}{2}",colName(col), row, row + lines - 1);
sheet.get_Range(range).Merge();
exportRows(children(dr), row, col + 1);
}
else if (lines == 0 && col == 2)
{
string range = string.Format("{1}{0}:{2}{0}", row, colName(col), colName(3));
sheet.get_Range(range).Merge();
}
row += Math.Max(lines, 1);
}
};

sheet.Cells[1, 1].Value = "类型";
sheet.Cells[1, 2].Value = "内容";
sheet.get_Range("B1:C1").Merge();

var level1 = dt.Select("pID=-1", "sortID");
exportRows(level1, 2, 1);

excel.DisplayAlerts = false;
book.SaveAs(@"d:\test.xlsx");
excel.Quit();
}
}
--------------------编程问答-------------------- 最简单的做法,自己拼一个table,然后输出出来就可以了 --------------------编程问答-------------------- 无论什么合并,每个单元格都可以定位,都有它有横坐标和纵坐标,

你可以计算出横坐标和纵坐标分别是多少,然后把内容填写到指定的位置就可以了

同时还可以设置左对齐,右对齐,字体变粗等
--------------------编程问答-------------------- 各位,不好意思,忘记说了,数据是添加进去的,不是固定的,就是因为是不固定,所以我才解决不了,等于说这个Excel里面的内容是没有固定性的。 --------------------编程问答--------------------

这有啥呀 不就是合并单元格么  随便一款dll都可以实现

一般来说 我用MyXls合并无压力 --------------------编程问答--------------------
引用 4 楼 jidong145 的回复:
各位,不好意思,忘记说了,数据是添加进去的,不是固定的,就是因为是不固定,所以我才解决不了,等于说这个Excel里面的内容是没有固定性的。


那你就要计算出行几行,第几列出来,计算不出来是没办法准确的填,
只要有数据来源,肯定可能计算出来,你就离成功那么一小步,加把力就登顶

补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,