Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 LINQ ADO.NET JavaScript DataGridView GridView AjaxPro DevExpress 面向对象 Extjs XML HTML教程 Oracle jQuery WPF MVC 分页 Office2010 GDI+ Visual C++2010 Dojo MySQL VB.NET WCF4.0 ASPxGridView WinForm textbox Sql2005 cookie Discuz!NT checkbox WCF SQL经典语句 T-SQL F# asp.net VS2008 SQL Ajax DropDownList VS2008新特性 TreeView Access Flex 页面执行时间 字符串 DataSet VB2005 回调 动画 C#时间 游戏 ASP.NET MVC
尚未分类 LINQ教程 Enterprise技术 性能优化/调试 水晶报表与打印 安全与加密 图形图像 文件处理 基础教程 Web Services 内置对象 控件示例 正则表达式\采集 ADO.NET 缓存\泛型\线程 XML技术 Url重写\静态页 vs2008综合教程
当前位置: 主页 > ASP.NET教程 > 尚未分类 >

生成Excel高级报表

时间:2010-01-11 13:26来源:未知 作者:admin 点击:

 

此示例主要用到了excel引用,宏。先看下效果图:


 

这里用的数据库是SQL server.说一下思路:

先制作一个excel样式,如上图,我这里标题是固定的,部门和日期是动态的,列名是固定的,中间那块数据是动态的,部门考勤员名字是动态的,其他都是静态.

把样式先做好.以下图是我先做好的样式:

 


8,9为什么要留两行,是为了第10行的统计函数设置,合计那行是已经设置好excel公式的,如C10是Sum(C8:C9)依此类推,如果往8,9中间插入行那excel

会自动扩展第10行的公式,如原是Sum(C8:C9)那插入一行就自动变成sum(C8:C10),这个大家应该都知道.而且往8,9中间插入行他的格式是根前一行

相同的,所以就这里就设置好了动态数据区的格式了.其他几个地方也是一样.

第三行的日期我是让他引用sheet2中的A2,部门是B2,考勤员是C2

下图是Sheet2,其中sheetdate,department,oper是列名,用来向sheet2这三个字段插入记录的


 

效果图中的主要数据区我是放在sheet3中,以下是sheet3样式,同样是列名,以效果图中是对应的.


 

sheet2只有一条记录,所以直接在sheet1对应处引用即可,如何让sheet1中引用sheet3中的数据,因为sheet3中的记录是动态的,

也不知道有多少行,所以要利用宏了.写宏其实也很简单,我这里也没写多少行代码.

Sub Macro1()
'
'
 Macro1 Macro
'
 宏由 XiaoBier 录制,时间: 2008-9-24
'
'
 快捷键: Ctrl+q
'

Dim i As Integer
Dim count As Integer
Dim rownum As Integer
count 
= Sheet3.UsedRange.Rows.count - 1 '这里是获取sheet3中的记录行数,减掉列名首行

Sheets(
"Sheet1").Select  '选中sheet1

'在sheet1中的8和9行之间插入行数
For i = 3 To count Step 1
    Sheet1.Range(
"A9").Select
        Selection.EntireRow.Insert
Next i

rownum 
= 1

'将sheet1中数据行引用sheet3中的数据
For i = 8 To count + 7 Step 1

    Range(
"A" & i) = rownum
    
    Range(
"B" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Sheet3!R[-6]C[-1],"""")"
    
    Range(
"C" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"D" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"E" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"F" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"G" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"H" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"I" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"J" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"K" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"L" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"M" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"N" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range(
"O" & i) = Null
    rownum 
= rownum + 1
Next i

End Sub

'这个子程序让一打开excel就自动调用宏
Sub auto_open()
Call Macro1
End Sub

是不是很简单,如果你不会写宏就录制吧,要什么操作就录制.然后把录制的代码copy下来就可以了.

样式文件建好.要生成excel的时候调用System.IO.File.Copy复制成目标名.没有其他操作.

接着是利用SQl openrowset往目标文件名的sheet3,和sheet2插入记录.

set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES ;DATABASE='+@path+@fname+''',[sheet3$])' 
             
exec('insert into '+@sql+'(name,late,patient,privacy,cyesis,suckle,children,relatives,delay,rest,law,adjust,year) select * from #sheetrst3')

--注意上面的列名好和sheet3中是对应的
 set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE=' +@path+@fname+''',[sheet2$])' 
exec('insert into '+@sql+'(sheetdate,department,oper) select '''+@date+''','''+@deptname+''','''+@operator+'''')

Tags:
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价