急~~~在线等 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里那?
/// <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导入导出问题(导出有乱码)的主要内容,如果未能解决你的问题,请参考以下文章