asp.net中我用一个gridview来放置工资表的数据,如下:姓名 编号 岗位工资 金额 加班 扣岗
张三 01 100 100 50 30
李四 02 200 100 60 40
王五 03 100 200 50 20我想把以上的数据导成工资条,如下:姓名 编号 岗位工资 金额 加班 扣岗
张三 01 100 100 50 30 姓名 编号 岗位工资 金额 加班 扣岗
李四 02 200 100 60 40姓名 编号 岗位工资 金额 加班 扣岗
王五 03 100 200 50 20导成EXCEL,就像上面这样的,人和人之间有空隙,便于裁减。请高手大哥帮忙,谢谢!!!
张三 01 100 100 50 30
李四 02 200 100 60 40
王五 03 100 200 50 20我想把以上的数据导成工资条,如下:姓名 编号 岗位工资 金额 加班 扣岗
张三 01 100 100 50 30 姓名 编号 岗位工资 金额 加班 扣岗
李四 02 200 100 60 40姓名 编号 岗位工资 金额 加班 扣岗
王五 03 100 200 50 20导成EXCEL,就像上面这样的,人和人之间有空隙,便于裁减。请高手大哥帮忙,谢谢!!!
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="objWebControl">控件名称</param>
/// <param name="strFileName">导出文件名</param>
public static void OutExcel(WebControl objWebControl, String strFileName)
{
if (String.IsNullOrEmpty(strFileName))
{
strFileName = DateTime.Now.ToString("yyyyMMdd-HHmmss");
}
Page objPage = objWebControl.Page;
objPage.Response.Clear();
objPage.Response.Buffer = true;
objPage.Response.Charset = "GB2312";
objPage.Response.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName.Trim() + ".xls"); // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
objPage.Response.ContentEncoding = System.Text.Encoding.UTF7;
objPage.Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。
System.IO.StringWriter objStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter objHtmlTextWriter = new System.Web.UI.HtmlTextWriter(objStringWriter);
objWebControl.RenderControl(objHtmlTextWriter);
objPage.Response.Output.Write(objStringWriter.ToString());
objPage.Response.Flush();
objPage.Response.End();
}
#endregion
//把DataGrid或者GridView传进来就可以使用了,非常简单
{
HttpResponse objRes;
objRes = objPage.Response;
objRes.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
objRes.ContentType = "application/vnd.ms-excel";
objRes.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName); //Excel单元格
string ExcelCell = "";
List<String> objColumnNames = new List<string>();
//设置列的名称的列表,一定要按顺序 //初始化一张DataTable和它的列
DataTable dtbl = //获取数据
DataRow[] drow = dtbl.Select(); //向HTTP输出流中写入取得的数据信息
foreach (String objItem in objColumnNames)
{
objRes.Write(objItem + "\t");
}
objRes.Write("\n");
//逐行处理数据
foreach (DataRow row in drow)
{
//在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n foreach (DataColumn col in dtbl.Columns)
{
ExcelCell += row[col].ToString() + "\t";
}
ExcelCell += "\n";
//当前行数据写入HTTP输出流,并且置空ExcelCell以便处理下一行数据
objRes.Write(ExcelCell);
ExcelCell = "";
}
//写缓冲区中的数据到HTTP头文件中
objRes.End();
}
先把數據讀取到dataset 就不用管頁面格式了
在導出按鈕點擊事件調用以下函數
把dataset数据保存到excel,
public void CreateExcel(DataSet ds, string FileName)
{
HttpResponse resp;
resp = Page.Response;
resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
string colHeaders = "", ls_item = "";
//定义表对象与行对象,同时用DataSet对其值进行初始化
DataTable dt = ds.Tables[0];
DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的
int i = 0;
int cl = dt.Columns.Count;
//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
for (i = 0; i < cl; i++)
{
if (i == (cl - 1))//最后一列,加n
{
colHeaders += dt.Columns[i].Caption.ToString() + "\n";
}
else
{
colHeaders += dt.Columns[i].Caption.ToString() + "\t";
}
}
resp.Write(colHeaders);
//向HTTP输出流中写入取得的数据信息
//逐行处理数据
foreach (DataRow row in myRow)
{
//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
for (i = 0; i < cl; i++)
{
if (i == (cl - 1))//最后一列,加n
{
ls_item += row[i].ToString() + "\n";
}
else
{
ls_item += row[i].ToString() + "\t";
}
}
resp.Write(ls_item);
ls_item = "";
}
resp.End();
}
一个示例:class AppTest
{
private Excel.ApplicationClass _x;
public static void Main0()
{
AppTest a = new AppTest();
a._x = new Excel.ApplicationClass();
a._x.UserControl = false;
for (int i = 0 ;i < 4; i++)
{
a.SaveToXls("D:\\test\\" + i + ".xls"); // 本例是在D盘下建立的test文件夹
}
a._x.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject((object) a._x);
System.GC.Collect();
} private void SaveToXls(string filename)
{
Excel.WorkbookClass wb = (Excel.WorkbookClass) this._x.Workbooks.Add(System.Reflection.Missing.Value);
for(int i = 1;i <= 4; i++)
{
this._x.Cells[i,1]=i.ToString();
this._x.Cells[i,2]="'bbb2";
this._x.Cells[i,3]="'ccc3";
this._x.Cells[i,4]="'aaa4";
}
wb.Saved = true;
this._x.ActiveWorkbook.SaveCopyAs(filename);
}
}【注:在VS.Net中运行是要添加Excel.dll组件的,Excel组件VS.Net本身是没有的,下面是生成Excel.dll的方法。】1.要保证机器本身要安装OFFICE. 2.把[C:\Program Files\Microsoft Office\Office:默认安装路径]下的EXCEL9.OLB文件拷贝到[C:\Visual Studio.Net\SDK\v1.1\Bin:VS.Net安装路径]路径下。3.打开Visual Studio .Net2003命令提示,运行TlbImp Excel9.olb Excel.dll ,就会在[C:\Visual Studio.Net\SDK\v1.1\Bin]下生成Excel.dll组件。4.在项目中添加Excel.dll引用就OK了。
create table table2
(
姓名 nvarchar(15),
编号 nvarchar(15),
岗位工资 decimal(10,2),
金额 decimal(10,2),
加班 decimal(10,2),
扣岗 decimal(10,2),
)insert into table2
select '张三','01',100,100,50,30
union all
select '李四','02',200,100,60,40
union all
select '王五','03',100,200,50,20 select * from table2二、编码
页面添加一GridView,两Button,分别命名btnLoadData,btnExport,代码如下
private const string conString = "Server=SZSOFT-SZZB\\SQLEXPRESS;database=office;uid=sa;pwd=;"; protected void btnLoadData_Click(object sender, EventArgs e)
{
GridView1.DataSource = GetSalary();
GridView1.DataBind();
} /// <summary>
/// 导出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnExport_Click(object sender, EventArgs e)
{ this.Response.Clear();
this.Response.Buffer = true;
this.Response.Charset = "GB2312";
this.Response.AppendHeader("Content-Disposition", "attachment;filename=salary.xls"); this.Response.ContentEncoding = System.Text.Encoding.UTF7;
this.Response.ContentType = "application/ms-excel"; DataTable dt = GetSalary();
string excelScript = CreateExcelScript(dt); this.Response.Output.Write(excelScript);
this.Response.Flush();
this.Response.End(); } /// <summary>
/// 获取工资数据
/// </summary>
/// <returns></returns>
private DataTable GetSalary()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = conString;
con.Open();
string sqlSelect = "Select * From table2";
SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, con);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
/// <summary>
/// 格式化导出数据
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
private string CreateExcelScript(DataTable dt)
{
// 表格
StringBuilder sbTable = new StringBuilder();
// 标题
StringBuilder sbTitle = new StringBuilder();
// 行数据
StringBuilder sbRowData = new StringBuilder();
// 总列数
int colCount = dt.Columns.Count;
// 总行数
int rowCount = dt.Rows.Count; // 标题
for (int i = 0; i < colCount; i++)
{
sbTitle.AppendFormat("<td>{0}</td>",dt.Columns[i].ColumnName);
} sbTable.Append("<table border=1>");
// 遍历数据
for(int m=0;m<rowCount;m++)
{
// 添加标题
sbTable.AppendFormat("<tr>{0}</tr>",sbTitle.ToString());
// 添加数据
DataRow dr = dt.Rows[m];
sbRowData = new StringBuilder();
for (int n = 0; n < colCount; n++)
{
sbRowData.AppendFormat("<td>{0}</td>", dr[n].ToString());
}
sbTable.AppendFormat("<tr>{0}</tr>", sbRowData.ToString());
// 添加空行
if (m != rowCount - 1)
{
sbTable.AppendFormat("<tr><td colspan='{0}'></td></tr>", colCount);
}
}
sbTable.Append("</table>"); return sbTable.ToString();
}
FROM (
SELECT '姓名' AS 姓名,'编号' AS 编号,
'岗位工资' AS 岗位工资,'金额' AS 金额,
'加班' AS 加班,'扣岗' AS 扣岗,o1=姓名,o2=0
FROM @T
UNION ALL
SELECT 姓名,编号,RTRIM(岗位工资),
RTRIM(金额),RTRIM(加班),
RTRIM(扣岗),姓名,1
FROM @T
UNION ALL
SELECT '','','','','','',
姓名,2
FROM @T WHERE 编号 NOT IN(SELECT TOP 1 编号 FROM @T)
) AS A
ORDER BY o1,o2先用SQL语句把表变成这样姓名 编号 岗位工资 金额 加班 扣岗姓名 编号 岗位工资 金额 加班 扣岗
张三 01 100 100 50 30 姓名 编号 岗位工资 金额 加班 扣岗
李四 02 200 100 60 40 姓名 编号 岗位工资 金额 加班 扣岗
王五 03 100 200 50 20
然后执行这条SQL,把数据填充到dataset,然后调用以下函数,导出excel
public void CreateExcel(DataSet ds, string FileName)
{
HttpResponse resp;
resp = Page.Response;
resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
string colHeaders = "", ls_item = "";
//定义表对象与行对象,同时用DataSet对其值进行初始化
DataTable dt = ds.Tables[0];
DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的
int i = 0;
int cl = dt.Columns.Count;
//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
for (i = 0; i < cl; i++)
{
if (i == (cl - 1))//最后一列,加n
{
colHeaders += dt.Columns[i].Caption.ToString() + "\n";
}
else
{
colHeaders += dt.Columns[i].Caption.ToString() + "\t";
}
}
resp.Write(colHeaders);
//向HTTP输出流中写入取得的数据信息
//逐行处理数据
foreach (DataRow row in myRow)
{
//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
for (i = 0; i < cl; i++)
{
if (i == (cl - 1))//最后一列,加n
{
ls_item += row[i].ToString() + "\n";
}
else
{
ls_item += row[i].ToString() + "\t";
}
}
resp.Write(ls_item);
ls_item = "";
}
resp.End();
}