我在做一个网络版考勤系统,其中包含用户表和考勤记录表(用户表:用户ID,用户姓名等;考勤记录表:ID,用户ID,考勤日期,上班时间,下班时间,上班考勤状态、下班考勤状态,其中上下班考勤状态是一个布尔型,为0没考勤,为1已考勤。)。现在我想实现报表打印功能,在报表中,按照以下格式显示数据在excel中,不知道怎么实现,很着急。 考勤统计表 日期 统计栏
姓名 1 2 3 4 5.。。30 31 事假 病假 旷工
序号
1 用户1
2 用户2
3 。
4 。
。 。
。 。
。 。 出勤:打钩 病假:三角形 旷工:叉
姓名 1 2 3 4 5.。。30 31 事假 病假 旷工
序号
1 用户1
2 用户2
3 。
4 。
。 。
。 。
。 。 出勤:打钩 病假:三角形 旷工:叉
不过总的来说这个表没有什么难度诶
比如 序号 姓名 出勤 病假 旷工
1 王二 打钩 三角形 叉拿以上举例: 我是用报表工具来做的,我的是FineReport,实现起来如下把序号和姓名直接拖入格子,FR里会默认显示序号对应姓名这样,出勤那里,比如出勤是布尔型,就写 if(出勤==0,“叉”,“勾”)
病假和旷工也是一样的道理 如果要统计的话也很简单,比如统计序号1的人请过几次事假,直接双击事假所在格子,将类型设为统计——个数。基本就这样,要是想换其他格式,原理一样。
/// 创建具有指定文件名和指定列表名称、类型的Excel文件。
/// </summary>
/// <param name="excelFileName">新创建的Excel文件路径名称</param>
/// <param name="excelFields">将创建的Excel文件的字段名称和类型,名称和类型用空格隔开,字段名间用逗号隔开。</param>
/// <param name="sheetName">将创建的Excel文件的sheet名。</param>
public static void CreateExcelFile(string excelFileName,string excelFields,string excelSheetName)
{
//注意:写入数据时的连接字符串与读取的时候不同,否则会出现错误“操作必须使用一个可更新的查询。”
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFileName +";Extended Properties=Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(connString);
OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = objConn; objCmd.Connection.Open(); //建立表结构
objCmd.CommandText = "CREATE TABLE " + excelSheetName + " ( "+excelFields+" )";
objCmd.ExecuteNonQuery(); objCmd.Connection.Close();
} /// <summary>
/// 将DataSet文件中指定的字段的数据转换成Excel文件中Sheet中的数据 。
/// 注意:excel字段名,例如"用户名,用户手机","用户表"。
/// </summary>
/// <param name="dataSet">指定的DataSet数据集</param>
/// <param name="datasetFields">DataSet数据集中的列集合字符串</param>
/// <param name="excelFileName">导入Excel文件的路径和文件名</param>
/// <param name="excelFields">Excel中的字段集合字符串</param>
/// <param name="excelSheetName">Excel程序的Sheet名</param>
public static void DataSetToExcel(DataSet dataSet,string datasetFields,string excelFileName,string excelFields,string excelSheetName)
{
//注意:写入数据时的连接字符串与读取的时候不同,否则会出现错误“操作必须使用一个可更新的查询。”
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFileName +";Extended Properties=Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(connString);
OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = objConn; //建立插入动作的Command字符串
string insertSheetName = excelSheetName.Trim();
string insertFields = "[" + excelFields.Trim().Replace(",","],[") + "]";
string insertParams = "@" + datasetFields.Trim().Replace(",",",@");
objCmd.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2}) ",insertSheetName,insertFields,insertParams); objCmd.Connection.Open(); string[] fields = datasetFields.Split(',');
string[] parms = insertParams.Split(','); //遍历DataSet将数据插入新建的Excel文件中
int nRowFlag = 0;
foreach (DataRow dr in dataSet.Tables[0].Rows)
{
for(int i =0 ; i < fields.Length & i < parms.Length; i++)
{
if(nRowFlag == 0)
{
objCmd.Parameters.Add(parms[i],dr[fields[i]]);
}
else
{
objCmd.Parameters[parms[i]].Value = dr[fields[i]] ;
}
}
objCmd.ExecuteNonQuery(); nRowFlag ++;
} objCmd.Connection.Close();
}完整的报表打印可以在我的上面下载
最后直接“导出成Excel”就OK了