导出下载csv以及编码问题

本文介绍了一种在指定路径上写入CSV文件并确保文件编码的方法,通过设置编码为GB2312来避免后续读取过程中的乱码问题。此外,还提供了两种文件下载方式:直接下载和缓冲下载,后者适用于较大文件,减轻服务器压力。

文件的读写,总会遇到编码问题.如果在写文件的时候就确定编码,那么在读取下载的时候就会很方便

ContractedBlock.gifExpandedBlockStart.gif写csv到指定路径上
 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;
        }
ContractedBlock.gifExpandedBlockStart.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();
        }
ContractedBlock.gifExpandedBlockStart.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();
            }
        }

请看具体使用:

ContractedBlock.gifExpandedBlockStart.gifCode
 //先写入
bool flag = WriteInExportedFile(filePath, dt.Columns, dt.Rows);

//再导出
 if (flag)
 {
        DownFile(fileName, filePath);
 }

转载于:https://www.cnblogs.com/yongxingxie/archive/2009/03/07/1405422.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值