請教水晶報表多列頭的問題

kfyypm 2011-07-22 10:25:45

水晶報表導出excel,如果有多表頭 的时候导出的时候不会自动合并单元格
需要的效果是
如何合併第1.2行 ?
如果思路也可以提示一下,謝謝
展開如下:


...全文
100 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
阿泰 2011-07-22
合并第1、2行??
还是合并第4、5行?
回复
kfyypm 2011-07-22
有人有類似的問題的嗎?
回复
阿泰 2011-07-22
用代码当然是最灵活的,呵呵。这个没话说。
回复
kfyypm 2011-07-22
在別處找的一篇直接導出execl的方法。沒有使用excel,這樣的話可能要自己去畫execl模板
不過這樣的課操作性就好多了

using System.Data;

using Excel;

using System.IO;

namespace Test.ExcelCom

{

/**//// <summary>

/// 将DataView中的数据导入Excel文件中

/// 作者:Rexsp

/// 创建:2004-4-4

/// </summary>

public class OutputExcel

{

私有成员#region 私有成员

/**//// <summary>

/// 数据的DataView

/// </summary>

private DataView dv=null;

/**//// <summary>

/// 表格标题

/// </summary>

private string title=null;

/**//// <summary>

/// 输出文件路径

/// </summary>

private string outFilePath=null;

/**//// <summary>

/// 输入文件名

/// </summary>

private string inputFilePath=null;

#endregion



公共属性#region 公共属性

/**//// <summary>

/// 数据的DataView

/// </summary>

public DataView DV

{

set{dv=value;}

}

/**//// <summary>

/// 表格标题

/// </summary>

public string Title

{

set{title=value;}

get{return title;}

}

/**//// <summary>

/// 输出文件路径

/// </summary>

public string OutFilePath

{

set{outFilePath=value;}

get{return outFilePath;}

}

/**//// <summary>

/// 输入文件路径

/// </summary>

public string InputFilePath

{

set{inputFilePath=value;}

get{return inputFilePath;}

}

#endregion



构造函数#region 构造函数

public OutputExcel()

{

}

public OutputExcel(DataView dv,string title)

{

//

// TODO: 在此处添加构造函数逻辑

//

}

#endregion



公共方法#region 公共方法

public void CreateExcel()

{

int rowIndex=4;//行起始坐标

int colIndex=1;//列起始坐标



ApplicationClass myApp=null;

Workbook myBook=null;

Worksheet mySheet=null;



//如果文件不存在,则将模板文件拷贝一份作为输出文件

//这里如果通过File.Create来创建文件是不行的,因为xls

//的空文件也有固定的格式,跟文本不一样的,也许有其它

//通过程序直接生成excel的方法,大家可以尝试尝试的

if(!File.Exists(outFilePath))

{

File.Copy(inputFilePath,outFilePath,true);

}



myApp= new ApplicationClass();

myApp.Visible=false;

object oMissiong=System.Reflection.Missing.Value;

myApp.Workbooks.Open(outFilePath,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong);

myBook=myApp.Workbooks[1];

mySheet=(Worksheet)myBook.ActiveSheet;





//

//取得标题

//

foreach(DataColumn col in dv.Table.Columns)

{

colIndex++;

mySheet.Cells[4,colIndex] = col.ColumnName;

mySheet.get_Range(mySheet.Cells[4,colIndex],mySheet.Cells[4,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐

}



//

//取得表格中的数据

//

foreach(DataRowView row in dv)

{

rowIndex ++;

colIndex = 1;

foreach(DataColumn col in dv.Table.Columns)

{

colIndex ++;

if(col.DataType == System.Type.GetType("System.DateTime"))

{

mySheet.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");

mySheet.get_Range(mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐

}

else

if(col.DataType == System.Type.GetType("System.String"))

{

mySheet.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();

mySheet.get_Range(mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐

}

else

{

mySheet.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();

}

}

}

//

//加载一个合计行

//

int rowSum = rowIndex + 1;

int colSum = 2;

mySheet.Cells[rowSum,2] = "合计";

mySheet.get_Range(mySheet.Cells[rowSum,2],mySheet.Cells[rowSum,2]).HorizontalAlignment = XlHAlign.xlHAlignCenter;

//

//设置选中的部分的颜色

//

mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Select();

mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种

//

//取得整个报表的标题

//

mySheet.Cells[2,2] = title;

//

//设置整个报表的标题格式

//

mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Bold = true;

mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Size = 22;

//

//设置报表表格为最适应宽度

//

mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Select();

mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Columns.AutoFit();

//

//设置整个报表的标题为跨列居中

//

mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).Select();

mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection;

//

//绘制边框

//

mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Borders.LineStyle = 1;

mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;//设置左边线加粗

mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//设置上边线加粗

mySheet.get_Range(mySheet.Cells[4,colIndex],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//设置右边线加粗

mySheet.get_Range(mySheet.Cells[rowSum,2],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//设置下边线加粗

myBook.Save();;

myBook.Close( true,outFilePath,true);

System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);

System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);

System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp);

GC.Collect();





}

#endregion

}





}



回复
kfyypm 2011-07-22
[Quote=引用 4 楼 babyt 的回复:]
这个不是已经合并了吗?第一列的单元格已经是合并的了吧?
你后面明显是两个行,是合并不掉的
倒是第4、5还有合并的可能。倒也不是合并,而是这两行可能可以处理成一行。
[/Quote]
阿 泰的意思是 前面的一行(3) 跟後面的二行(3.4) 是無法合併成一行的 對吧?

有第五行的原因是 主檔跟明細記錄之間莫名其妙的產生了一行(在另外一個帖子上看到的),第五行不知道有米有上面方式可以消除掉
回复
阿泰 2011-07-22
这个不是已经合并了吗?第一列的单元格已经是合并的了吧?
你后面明显是两个行,是合并不掉的
倒是第4、5还有合并的可能。倒也不是合并,而是这两行可能可以处理成一行。
回复
kfyypm 2011-07-22
[Quote=引用 2 楼 babyt 的回复:]
合并第1、2行??
还是合并第4、5行?
[/Quote]

合併第3.4.5
回复
相关推荐
发帖
图表区
创建于2007-09-28

4810

社区成员

.NET技术 图表区
申请成为版主
帖子事件
创建了帖子
2011-07-22 10:25
社区公告
暂无公告