您的位置:首页 > 运维架构

如何将datagridview中数据导出.txt

2011-05-18 11:57 543 查看
 

你只要循环吧datagridview数据写入excel就可以了

class AppTest
{
private Excel.ApplicationClass _x;
public static void Main0()
{
AppTest a = new AppTest();
a._x = new Excel.ApplicationClass();
a._x.UserControl = false;
for (int i = 0 ;i < 4; i++)
{

a.SaveToXls( "D://test// " + i + ".xls "); // 本例是在D盘下建立的test文件夹
}
a._x.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject((object) a._x);
System.GC.Collect();
}

private void SaveToXls(string filename)
{
Excel.WorkbookClass wb = (Excel.WorkbookClass) this._x.Workbooks.Add(System.Reflection.Missing.Value);
for(int i = 1;i <= 4; i++)
{
this._x.Cells[i,1]=i.ToString();
this._x.Cells[i,2]= " 'bbb2 ";
this._x.Cells[i,3]= " 'ccc3 ";
this._x.Cells[i,4]= " 'aaa4 ";
}

wb.Saved = true;
this._x.ActiveWorkbook.SaveCopyAs(filename);
}
}

【注:在VS.Net中运行是要添加Excel.dll组件的,Excel组件VS.Net本身是没有的,下面是生成Excel.dll的方法。】

1.要保证机器本身要安装OFFICE.

2.把[C:/Program Files/Microsoft Office/Office:默认安装路径]下的EXCEL9.OLB文件拷贝到[C:/Visual Studio.Net/SDK/v1.1/Bin:VS.Net安装路径]路径下。

3.打开Visual Studio .Net2003命令提示,运行TlbImp Excel9.olb Excel.dll ,就会在[C:/Visual Studio.Net/SDK/v1.1/Bin]下生成Excel.dll组件。

4.在项目中添加Excel.dll引用就OK了。 .阿門□ 回答采纳率:32.5% 2010-07-01 14:46 您已经评价过!好:0 您已经评价过!不好:0
/// <summary>
///使用OLEDB方式读写Excel,不需要Office组件支持,后缀可以.xls ,.csv等
/// </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;
}

回答人的补充 2010-07-01 14:58 /// <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
4000
; 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!";
}
}

回答人的补充 2010-07-01 15:07 这里面有写好的,导入导出.你拷过去就可以用了

/// <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;
}
}
}
}

 

タ可乐 回答采纳率:38.9% 2010-07-01 14:53 您已经评价过!好:0 您已经评价过!不好:0 自定义路径,导出为xls文件。只需要using System.IO;

SaveFileDialog sf = new SaveFileDialog();
sf.DefaultExt = "*.xls";
sf.Filter = "Microsoft Excel 文档|*.xls";
if (sf.ShowDialog() == DialogResult.OK)
{
FileStream fs = File.Open(sf.FileName, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("gb2312"));
string line = "";
foreach (DataGridViewColumn dvc in dataGridView1.Columns)
{
line += dvc.Name + "/t";
}
sw.WriteLine(line);
foreach (DataGridViewRow dr in dataGridView1.Rows)
{
line = "";
foreach (DataGridViewCell dc in dr.Cells)
{
line += dc.Value + "/t";

}
sw.WriteLine(line);
}
sw.Close();
fs.Close();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息