导出下载csv以及编码问题
文件的读写,总会遇到编码问题.如果在写文件的时候就确定编码,那么在读取下载的时候就会很方便
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
private bool WriteInExportedFile(string strPath, DataColumnCollection tableColumns, DataRowCollection tableRows)
{
bool flag = true;
//这里必须设置写入文件的编码,在读取的时候才不需要设置!!!!
System.IO.StreamWriter File = new System.IO.StreamWriter(strPath, false, System.Text.Encoding.GetEncoding("gb2312"));
int rowscreated = 0;
string sqlinsert = "";
try
{
//Loop through columns of table to generate first row of CSV file
int ctrColumn = 0;
foreach (DataColumn dc in tableColumns)
{
if (ctrColumn < tableColumns.Count - 1)
sqlinsert += dc.ColumnName.ToString() + ",";
else
sqlinsert += dc.ColumnName.ToString();
ctrColumn++;
}
File.WriteLine(sqlinsert);
foreach (DataRow row in tableRows)
{
sqlinsert = "";
string sqlvalues = "";
object[] rowItems = row.ItemArray;
ctrColumn = 0;
foreach (DataColumn dcol in tableColumns)
{
if (ctrColumn < tableColumns.Count - 1)
sqlvalues += rowItems[ctrColumn].ToString().Replace("''", "'") + ",";
else
sqlvalues += rowItems[ctrColumn].ToString().Replace("''", "'");
ctrColumn++;
}
sqlinsert = sqlinsert + sqlvalues;
File.WriteLine(sqlinsert);
rowscreated++;
}
File.Close();
}
catch (Exception ae) //Error
{
flag = false;
}
finally
{
File.Close();
}
return flag;
}
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public void MyDirectDownFile(string filepath)
{
//客户端保存的文件名
filename = "我的csv.csv";
FileInfo fileInfo = new FileInfo(filepath);
//清除不必要的头,基类中可能乱添加的东西!
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
// HttpUtility.UrlEncode(filename) 是使得文件名正确显示
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename));
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
// Response.ContentType 的种类有很多!
Response.ContentType = "application/octet-stream";
Response.WriteFile(fileInfo.FullName);
//这样就可以抛出下载了!
Response.Flush();
Response.End();
}
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public void MyFlushDownFile(string filename, string filepath)
{
filename = "我的csv.csv";//客户端保存的文件名
//读取文件,希望这个文件在写入的时候是gb2312写入的,那么导出就不会有乱码了!
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filepath);
if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
byte[] buffer = new byte[ChunkSize];
System.IO.FileStream iStream = System.IO.File.OpenRead(filepath);
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
//这几句话是必须要的,如果没有,基类中可能有方法向里面乱添加东西!!!
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
//同样,这里没有设置编码,因为读取的文件中设置了gb2312,这里就没有必要了!
// Response.ContentType 的种类有很多!
Response.ContentType = "application/octet-stream";
// HttpUtility.UrlEncode(filename) 是使得文件名正确显示
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
}
请看具体使用:
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
//先写入
bool flag = WriteInExportedFile(filePath, dt.Columns, dt.Rows);
//再导出
if (flag)
{
DownFile(fileName, filePath);
}
既知之,则Do之!