using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.IO;
namespace MyPracticeConsole
{
public class RollRealExcel
{
static string rowToColumnSql = "declare @s varchar(8000) \r\n" +
"set @s='select cast(date as datetime) as Date' \r\n" +
"select " +
"@s=@s +',['+a.username+']=max(case when username=''+a.username+'' then attendancestate else 0 end)' " +
"from (select username from Userinfo where firm=0 ) a \r\n" +
"set @s=@s+' from record where Date like '%{0}-{1}%' group by Date order by date' \r\n" +
"exec(@s)";
//static string sqlConnectionString = "Data Source=SameWayDev02;Database=AttendanceInfo;User ID=sa;Password=sa;";
static string sqlConnectionString = "Data Source=192.168.1.111;Database=AttendanceInfo;User ID=sa;Password=sa;";
private static DataTable GetData()
{
string sql = string.Format(rowToColumnSql, DateTime.Today.AddMonths(-1).Year, DateTime.Today.AddMonths(-1).Month);
SqlConnection connection = new SqlConnection(sqlConnectionString);
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
adapter.SelectCommand.ExecuteNonQuery();
DataTable table = new DataTable();
adapter.Fill(table);
connection.Close();
DataColumn[] keys = new DataColumn[1];
keys[0] = table.Columns[0];
table.PrimaryKey = keys;
return table;
}
private static double GetMark(string State)
{
int tempMark = int.Parse(State);
double acturalMark = -5.00;
switch (tempMark)
{
case 0:
acturalMark = -1.00;
break;
case 1:
acturalMark = 1.00;
break;
case 21:
acturalMark = 0.85;
break;
case 22:
acturalMark = 0.70;
break;
case 23:
acturalMark = 0.50;
break;
case 41:
acturalMark = 0.85;
break;
case 42:
acturalMark = 0.70;
break;
case 43:
acturalMark = 0.50;
break;
case 51:
acturalMark = 0.70;
break;
case 52:
acturalMark = 0.55;
break;
case 53:
acturalMark = 0.35;
break;
case 54:
acturalMark = 0.55;
break;
case 55:
acturalMark = 0.40;
break;
case 56:
acturalMark = 0.20;
break;
case 57:
acturalMark = 0.35;
break;
case 58:
acturalMark = 0.20;
break;
default:
acturalMark = 0.00;
break;
}
return acturalMark;
}
public static void ExportExcel()
{
DataTable table = GetData();
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.Title = "导出Excel文件到";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
Stream myStream;
myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));
DateTime lastMonth = DateTime.Today.AddMonths(-1);
int dayCount = DateTime.DaysInMonth(lastMonth.Year, lastMonth.Month);
int personCount = table.Columns.Count - 1;
try
{
SqlConnection connection = new SqlConnection(sqlConnectionString);
connection.Open();
//总天数
double[] sumMarks = new double[personCount];
string title = string.Format("{0}年{1}月份考勤统计", lastMonth.Year, lastMonth.Month);
sw.WriteLine(title);
string secondtitle = string.Format("实际考勤天数:{0}", table.Rows.Count);
sw.WriteLine(secondtitle);
//写标题
for (int i = 0; i < table.Columns.Count; i++)
{
if (i == 0)
{
sw.Write("日期");
}
else
{
sw.Write(table.Columns[i].ColumnName);
}
sw.Write("\t");
}
sw.WriteLine();
//写内容
int rowCount = 1;
for (int j = 1; j < dayCount + 1; j++)
{
DateTime time = DateTime.Parse(string.Format("{0}-{1}-{2}", lastMonth.Year, lastMonth.Month, j));
DataRow row = table.Rows.Find(time);
if (row != null)
{
for (int k = 0; k < table.Columns.Count; k++)
{
if (k == 0)
{
sw.Write(j);
}
else
{
double mark = GetMark(table.Rows[rowCount - 1][k].ToString());
string markString = mark.ToString("F2");
if (markString == "1.00")
{
sw.Write(markString);
sumMarks[k - 1] += mark;
}
else
{
string sql = string.Format("Select MissReason From Record where date='{0}-{1}-{2}' and UserName='{3}'",
lastMonth.Year, lastMonth.Month, j, table.Columns[k].ColumnName);
SqlCommand command = new SqlCommand(sql, connection);
object a = command.ExecuteScalar();
string missReason = a == null ? string.Empty : a.ToString();
if (missReason == string.Empty)
{
sw.Write("0.00");
}
else
{
sw.Write(markString + missReason);
sumMarks[k - 1] += mark;
}
}
}
sw.Write("\t");
}
rowCount++;
}
else
{
for (int k = 0; k < table.Columns.Count; k++)
{
if (k == 0)
{
sw.Write(j);
}
else
{
sw.Write("0.00");
}
sw.Write("\t");
}
}
sw.WriteLine();
}
sw.Write("汇总\t");
for (int i = 0; i < personCount; i++)
{
sw.Write(sumMarks[i].ToString("F2"));
sw.Write("\t");
}
sw.WriteLine();
sw.Write("事假加1.0、病假加1.5婚丧假在规定的时间内以及外勤、调休、出差加2.0\t");
sw.WriteLine();
sw.Close();
myStream.Close();
connection.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
return;
}
finally
{
sw.Close();
myStream.Close();
}
}
}
}
}