Monday, January 29, 2007

Convert DataTable to CSV

Problem:
User wants to view data in Excel.
1) Execute query against database.
2) Build DataTable object.
3) Populate Grid Control (DataGrid, GridView...)
4) Export DataTable to CSV file



Solution:
private int Export2CSV(DataTable dt,
string sFullPathAndFileName,
bool bNeedHeaderRow)
{

//usage history initialization
this.int_error_level = 0;
this.str_last_message = string.Empty;

try
{
System.IO.StreamWriter sw = new
System.IO.StreamWriter(sFullPathAndFileName,
false,
System.Text.Encoding.ASCII,
4096);


System.Text.StringBuilder buff = new System.Text.StringBuilder();

if (bNeedHeaderRow == true)
{
//build header
for (int c = 0; c < dt.Columns.Count; c++)
{
buff.Append(dt.Columns[c].ColumnName.ToString().ToUpper());
if (c < (dt.Columns.Count - 1))
{
buff.Append(",");
}
}

sw.WriteLine(buff.ToString());
buff.Length = 0;

}


for (int r = 0; r < dt.Rows.Count; r++)
{
for (int c = 0; c < dt.Columns.Count; c++)
{
switch (dt.Columns[c].DataType.ToString().ToUpper())
{
case "SYSTEM.STRING":
case "SYSTEM.DATETIME":
buff.Append("\"" + dt.Rows[r][c].ToString() + "\"");
break;
default:
buff.Append(dt.Rows[r][c].ToString());
break;
}

if (c < (dt.Columns.Count - 1))
{
buff.Append(",");
}
}

sw.WriteLine(buff);
buff.Length = 0;
}


sw.Flush();
sw.Close();
sw = null;

return (0);
}
catch (System.Exception ex)
{
this.int_error_level = 1;
this.str_last_message = ex.Message.ToString();
return (-1);
}
}

No comments: