急~~~在线等 excel导入导出问题(导出有乱码)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急~~~在线等 excel导入导出问题(导出有乱码)相关的知识,希望对你有一定的参考价值。

if (sfDialog.ShowDialog() == DialogResult.OK)

write = new StreamWriter(sfDialog.FileName, true);
string title = csvTitle();
string content = null;
write.Write(title);
for (int i = 0; i < this.dataGridView1.RowCount-1; i++)

for (int j = 0; j < this.dataGridView1.ColumnCount; j++)

if (j == this.dataGridView1.ColumnCount - 1)

content = this.dataGridView1.Rows[i].Cells[j].Value.ToString();
write.Flush();

else

content = this.dataGridView1.Rows[i].Cells[j].Value + ",";
write.Flush();


write.Write("\r\n");
write.Flush();


我想知道要怎么样才不会是乱码,我有记事本打开就不是乱码,csv就是,还有只有标题加进去了,数据没进去,
还想请问导入应该怎么做那,我的分没多少了,如果解决了再最加
导出以解决,请问导入应该怎么实现那,我现在用文件流在对,可是怎么把他放到datagridview里那?

拷过去直接用. 用导入返回的DATATBLE绑定到DATAGRIDVIEW控件.

/// <summary>
///使用OLEDB方式读写Excel,不需要Office组件支持
/// </summary>
class IOIEExcel

/************************************************************************************************************************
*
* /// 本人的Excel导入导出方法有以下特色:
///1、使用OLEDB方式读写Excel,不需要Office组件支持;
///2、支持导入导出时进度条(ProgressBar);
///3、可以将本地DataSet中的数据类型转换为对应的OleDB的数据类型导出,使导出的数据区分开时间、数字、字符串,而不是像上一版中一样全是字符串;
///4、修正了Excel2003中某些工作薄名称为汉字的表无法正确识别的BUG
///5、删除了一个无用的方法GetFirstSheetName,本方法用于获取第一个工作薄的表明,一点用没有。
*
* **********************************************************************************************************************/

/// <summary>
/// 获取链接字符串
/// </summary>
/// <param name="strFilePath"></param>
/// <returns></returns>
public static string GetExcelConnection(string strFilePath)

if (!File.Exists(strFilePath))

throw new Exception("指定的Excel文件不存在!");

return
@"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=" + strFilePath + ";" +
@"Extended Properties=" + Convert.ToChar(34).ToString() +
@"Excel 8.0;" + "Imex=2;HDR=Yes;" + Convert.ToChar(34).ToString();


/// <summary>
/// 返回指定文件所包含的工作簿列表;如果有WorkSheet,就返回以工作簿名字命名的ArrayList,否则返回空
/// </summary>
/// <param name="strFilePath">要获取的Excel</param>
/// <returns>如果有WorkSheet,就返回以工作簿名字命名的ArrayList,否则返回空</returns>
public static ArrayList GetExcelWorkSheets(string strFilePath)

ArrayList alTables = new ArrayList();

OleDbConnection odn = new OleDbConnection(GetExcelConnection(strFilePath));
odn.Open();

DataTable dt = new DataTable();

dt = odn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

if (dt == null)

throw new Exception("无法获取指定Excel的架构。");


foreach (DataRow dr in dt.Rows)

string tempName = dr["Table_Name"].ToString();

int iDolarIndex = tempName.IndexOf('$');

if (iDolarIndex > 0)

tempName = tempName.Substring(0, iDolarIndex);


//修正了Excel2003中某些工作薄名称为汉字的表无法正确识别的BUG。
if (tempName[0] == '\'')

if (tempName[tempName.Length - 1] == '\'')

tempName = tempName.Substring(1, tempName.Length - 2);

else

tempName = tempName.Substring(1, tempName.Length - 1);



if (!alTables.Contains(tempName))

alTables.Add(tempName);



odn.Close();

if (alTables.Count == 0)

return null;

return alTables;


/// <summary>
/// 获取指定路径、指定工作簿名称的Excel数据
/// </summary>
/// <param name="FilePath">文件存储路径</param>
/// <param name="WorkSheetName">工作簿名称</param>
/// <returns>如果争取找到了数据会返回一个完整的Table,否则返回异常</returns>
public static DataTable GetExcelData(string FilePath, string WorkSheetName)

DataTable dtExcel = new DataTable();
OleDbConnection con = new OleDbConnection(IOIEExcel.GetExcelConnection(FilePath));
OleDbDataAdapter adapter = new OleDbDataAdapter("Select * from [" + WorkSheetName + "$]", con);

con.Open();
adapter.FillSchema(dtExcel, SchemaType.Mapped);
adapter.Fill(dtExcel);

con.Close();

dtExcel.TableName = WorkSheetName;
return dtExcel;


/// <summary>
///
/// </summary>
/// <param name="dt">数据源(数据表)</param>
/// <param name="ExcelFileName">要导出的Excle文件,此文件必须已存在</param>
///// <param name="ModelFile">ModelFile为模板文件,该文件与数据源中的表一致,否则数据会导出失败。
///// ModelFile文件里,需要有一张 与 dt.TableName 一致的表,而且字段也要一致。
///// 注明:如果不用ModelFile的话,可以用一个空白Excel文件,
///// 不过,要去掉下面创建表的注释,让OleDb自己创建一个空白表。</param>
/// <returns></returns>
public static string ExportTable2ExcelFile(DataTable dt, string ExcelFileName, string strWorkSheetName, ref System.Windows.Forms.ProgressBar progressBar)//, string ModelFile)

if (File.Exists(ExcelFileName) == false)

return "指定文件不存在!";


if (dt == null)

return "数据不能为空!";


if (strWorkSheetName.ToString() == "")

return "数据表名不可以为空!";

dt.TableName = strWorkSheetName;

int iRows = dt.Rows.Count;
int iCols = dt.Columns.Count;

StringBuilder stringBuilder;
string connString;

if (iRows == 0)

return "没有可导入数据!";


stringBuilder = new StringBuilder();

connString = IOIEExcel.GetExcelConnection(ExcelFileName);// "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;";

//先查看此Excel中是否有相关Table,如果有的话就删除,然后导入新的。
//生成创建表的脚本
stringBuilder.Append("CREATE TABLE ");
stringBuilder.Append(dt.TableName + " ( ");
for (int i = 0; i < iCols; i++)

//此处是本版本改进中最实用的地方
string strType = IOIEExcel.GetOleDataType(dt.Columns[i]);
if (i < iCols - 1)
stringBuilder.Append(string.Format("0 1,", dt.Columns[i].ColumnName, strType));
else
stringBuilder.Append(string.Format("0 1)", dt.Columns[i].ColumnName, strType));


using (OleDbConnection objConn = new OleDbConnection(connString))

//控制进度条
int iCount = 1, iTotal = dt.Rows.Count + 4;
progressBar.Minimum = Convert.ToInt32(100 / iTotal);
progressBar.Maximum = 100;
progressBar.Step = 1;

OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = objConn;

//插入新表
objCmd.CommandText = stringBuilder.ToString();

try

objConn.Open();
//插入新表
objCmd.ExecuteNonQuery();
progressBar.PerformStep();

catch (Exception e)

return "在Excel中创建表失败!错误信息:" + e.Message;


stringBuilder.Remove(0, stringBuilder.Length);

stringBuilder.Append("INSERT INTO ");
stringBuilder.Append(dt.TableName + " ( ");

//先插入标头
for (int i = 0; i < iCols; i++)

if (i < iCols - 1)
stringBuilder.Append(dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append(dt.Columns[i].ColumnName + ") values (");


for (int i = 0; i < iCols; i++)

if (i < iCols - 1)
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ")");


progressBar.PerformStep();

//建立插入动作的Command
objCmd.CommandText = stringBuilder.ToString();
OleDbParameterCollection oleParam = objCmd.Parameters;

oleParam.Clear();
for (int i = 0; i < iCols; i++)

OleDbType oleDbType = IOIEExcel.GetRefOleDataType(dt.Columns[i]);

//此处是本版本改进中最实用的地方
oleParam.Add(new OleDbParameter("@" + dt.Columns[i].ColumnName, oleDbType));

progressBar.PerformStep();

//遍历DataTable将数据插入新建的Excel文件中
foreach (DataRow row in dt.Rows)

for (int i = 0; i < oleParam.Count; i++)

oleParam[i].Value = row[i];


objCmd.ExecuteNonQuery();

progressBar.PerformStep();


progressBar.Value = progressBar.Maximum;
return "数据已成功导入Excel!";



/// <summary>
/// 获取与本地DataSet中指定列的类型对应的OleDbType的数据类型字符串
/// </summary>
/// <param name="dataColumn"></param>
/// <returns></returns>
public static string GetOleDataType(DataColumn dataColumn)

switch (dataColumn.DataType.Name)

case "String"://字符串

return "VarChar";

case "Double"://数字

return "Double";

case "Decimal"://数字

return "Decimal";

case "DateTime"://时间

return "Date";

default://

return "VarChar";




/// <summary>
/// 获取与本地DataSet中指定列的类型对应的OleDbType类型
/// </summary>
/// <param name="dataColumn"></param>
/// <returns></returns>
public static OleDbType GetRefOleDataType(DataColumn dataColumn)

switch (dataColumn.DataType.Name)

case "String"://字符串

return OleDbType.VarChar;

case "Double"://数字

return OleDbType.Double;

case "Decimal"://数字

return OleDbType.Decimal;

case "DateTime"://时间

return OleDbType.Date;

default:

return OleDbType.VarChar;



参考技术A 我QQ空间里有导出Excel的方法 你可以去试试 qq452337739

fputcsv 导出excel,解决内存性能乱码科学计数法问题

    在PHP的日常开发中,时常会需要导出 excel ,一般我们会使用 PHPExcel ,性能强大,但是在数据量大的时候,phpexcel 性能差、内存溢出等各种不可控问题就会出现。因此,如果对导出样式要求不高,我们可以使用 php 原生的 fputcsv 导出表格,最近项目中,有同事就遇到这个问题,推荐他使用 fputcsv,本着分享的精神,在此记录,希望能够帮助一些新入行的童鞋。

直接上代码:

<?php 
ob_end_clean();

// 文件名
$filename = $type.‘_order_‘.date(‘YmdHis‘).‘.csv‘;
$title = [‘单号‘, ‘状态‘, ‘数量‘, ‘商品名‘, ‘发货人‘, ‘收货人‘];

// 设置 header 头
header(‘Content-Type: application/vnd.ms-excel‘); // 文件格式
header(‘Content-Type: charset=utf-8‘); // 文件编码
header(‘Content-Disposition: attachment; filenaeme=‘. $filename); // 文件名
header(‘Content-Type: application/octet-stream‘); // 二进制流
// header("Accept-Ranges:bytes");// 表明范围单位为字节,可不写
header("Pragma: no-cache"); // 禁止缓存
header("Expires: 0");// 有效期时间

$fp = fopen(‘php://output‘,‘w+‘);

fputcsv($fp, transCode($title));

// 处理数据 [伪代码]
// 如果从数据库获取数据并处理,可以分批进行查询,也可以使用多个文件进行导出
// $result

$count = 0; //计数器
$limit = 10000; 

while ($row = $result->fetchRow()) {
    $count++;
    if ($count == $limit) {
        ob_flush(); // 刷新 php 缓存
        flush(); // 刷新输出缓存
        $count = 0; // 重置计数器
    }

    // 逐行写入
    fputcsv($fp, transCode($row));
    unset($row);
}

fclose($fp);
// 编码转换
// 代码一般是 utf-8 格式, csv 导出默认也是 utf-8 格式,而 excel 直接打开默认不识别 utf-8 格式,因此,要导出数据都要进行 格式转换
// 每个字段前加上 "	" 可以防止长数字显示为科学计数法 
function transCode(array &$arr){
    foreach ($arr as &$v) {
        $v = "	".iconv(‘utf-8‘, ‘gb2312//ignore‘, $v);
    }
}

临时写的 demo ,如错误还请指教

以上是关于急~~~在线等 excel导入导出问题(导出有乱码)的主要内容,如果未能解决你的问题,请参考以下文章

pb 9.0 批量导出excel 高分在线等

解决导入导出Excel表格文字乱码问题

jxl导出excel时报错,求高手支招,在线等

arcmap导出excel为乱码 excel为乱码解决办法

Eclipse导出jar,无法运行,在线高分急等。

火狐浏览器导出EXCEL 表格,文件名乱码问题