일반적인 HTML 방식의 EXCEL 저장은 화면에 그려진 모든 정보를 그려내기 때문에
그리드에 체크박스가 있거나 필요없는 셀이 있는경우 그것까지 표현하려고 하므로 적당하게 처리를 해줄 필요가 있음.
(아래의 경우는 체크박스가 체크된 항목의 행만 가져와서 파일을 생성하게 됨)
이미 그려진 그리드뷰를 대상으로 하므로 페이징등으로 전체 데이터가 보이지 않는경우에는 모두 표현이 불가함.
모든 데이터를 표현하려면 makeGV.DataSource 부분에 전체 데이터셋을 받도록함 (커넥션 한번더 발생)
-----------------------------------------------------------------------------------------------------------
디자인단 그리드뷰 셋팅
<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="Black" GridLines="Horizontal"
BackColor="White" BorderColor="white" BorderStyle="solid" BorderWidth="1px" Width="809px"
AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging" PagerSettings-Visible="false"
OnRowDataBound="GridView1_RowDataBound">
<FooterStyle BackColor="#CCCC99" ForeColor="Black" />
<PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
<Columns>
<asp:TemplateField HeaderText="선택">
<ItemTemplate>
<input id="RowLevelCheckBox" runat="server" type="checkbox" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
cs 단 로직
private void ExcelSave_HTML(GridView GV)
{
try
{
// 데이터가 있을(행) 경우에만 실행
if (getRowCount(GV) > 0)
{
// 기존 버퍼내용 제거
Response.Clear();
Response.Buffer = true;
// 파일네임 지정
Response.AddHeader("content-disposition", "attachment;filename=TestHtml.xls");
// 파일타입(데이터형식) 지정
Response.ContentType = "application/vnd.ms-excel";
//// 문자셋 지정
Response.Charset = "ks_c_5601-1987";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("ks_c_5601-1987");
////Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
//this.EnableViewState = false;
// 문자열 기록 개체 인스턴스 생성
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
// html 표현 방식으로 변환
System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
// 엑셀문서 제목 설정
string Title = "<P align=center><font size=4 face=Gulim><B>테스트</B></font></p>";
Title += "<p align=right><font size=3 face=Gulim>저장일자 : " + DateTime.Now.ToShortDateString() + "</font></p>";
htmlWriter.Write(Title);
// 엑셀생성할 새로운 그리드뷰 생성 (필요없는 부분 삭제)
GridView makeGV = new GridView();
// 생성된 데이터그리드 디자인
makeGV.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
makeGV.HeaderStyle.BackColor = Color.FromName("#E5EAEE");
makeGV.RowStyle.HorizontalAlign = HorizontalAlign.Center;
// 그리드뷰에 새 데이터 바인드
makeGV.DataSource = getDateSet_from_GridView(GV);
makeGV.DataBind();
// 엑셀 Export
makeGV.RenderControl(htmlWriter);
Response.Write(stringWriter.ToString());
Response.End();
}
else
{
string alertMsg = "선택된 ROW 가 없습니다.";
string str = "<script>alert('" + alertMsg + "'); </script>";
Page.RegisterStartupScript("done", str);
}
}
catch (Exception ex)
{
//Response.Write(ex.Message);
}
}
// 보통 그리드뷰 첫번째 셀에 체크박스가 위치하는 경우가 많아 처리해보고자함.
private DataTable getDateSet_from_GridView(GridView GV)
{
int rowNum = GV.Rows.Count;
int colNum = GV.Rows[0].Cells.Count - 1;
string[] rowItems = new string[colNum];
DataTable dt = new DataTable();
for (int k = 1; k <= colNum; k++)
dt.Columns.Add(new DataColumn("Col" + k.ToString(), typeof(string)));
for (int i = 0; i < GV.Rows.Count; i++)
{
HtmlInputCheckBox cbCtrl = (HtmlInputCheckBox)GV.Rows[i].Cells[0].FindControl("RowLevelCheckBox");
if (cbCtrl.Checked)
{
DataRow dr = dt.NewRow();
for (int j = 0; j < colNum; j++)
{
rowItems[j] = GV.Rows[i].Cells[j + 1].Text.Replace(" ","");
dr[j] = rowItems[j];
}
dt.Rows.Add(dr);
}
}
return dt;
}
// 선택된 행이 몇개인지 체크
private int getRowCount(GridView GV)
{
int cbCnt = 0;
for (int i = 0; i < GridView1.Rows.Count; i++)
{
HtmlInputCheckBox cbCtrl = (HtmlInputCheckBox)GV.Rows[i].Cells[0].FindControl("RowLevelCheckBox");
if (cbCtrl.Checked)
cbCnt++;
}
return cbCnt;
}
public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
{
// 그리드뷰의 내용을 HTML 방식으로 저장하기 위한 매서드.
}