1. 如何向C++中读入一张excel表
说来话长,3年前用C写过这样的程序,没有问题。调用的是ODBC32.DLL提供的API,主要使用ODBC方式通过EXCEL驱动连接数据库,构造sql语句进行读写操作。找出来看了一下,觉得对外不宜(只适合我那个表)。还是介绍一个通用的给你吧:
http://www.codeproject.com/KB/office/BasicExcel.aspx
唯一的障碍可能是文章用的英文。如果你能想到用C++读Excel, 那么读英文应该没问题。他已经把我所说的东西都封装成了一个BasicExcel类。你可以下载其全部源程序以及他的Project仔细研究。
2. 在c语言使用ODBC访问Excel,用SQLDriverConnect方法连接数据源连接字符需要哪些参数
"MICROSOFT EXCEL DRIVER (*.XLS)"。然后,可根据下面步骤进行:
1. 在StdAfx.h文件中加入:
#include <afxdb.h>
#include <odbcinst.h>
2. 通过ODBC直接创建Excel文件并在表中插入数据(暂定文件名:Demo.xls)
//创建并写入Excel文件
void CRWExcel::WriteToExcel()
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile = "c:\\demo.xls"; // 要建立的Excel文件
CString sSql;
TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
sDriver, sExcelFile, sExcelFile);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 创建表结构(姓名、年龄)
sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
database.ExecuteSQL(sSql);
// 插入数值
sSql = "INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)";
database.ExecuteSQL(sSql);
}
// 关闭数据库
database.Close();
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
}
END_CATCH_ALL;
}
3. 通过ODBC直接读取Excel文件(暂定文件名:Demo.xls)
// 读取Excel文件
void CRWExcel::ReadFromExcel()
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "Demo.xls"; // 将被读取的Excel文件名
// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动!");
return;
}
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
TRY
{
// 打开数据库(既Excel文件)
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 设置读取的查询语句.
sSql = "SELECT Name, Age "
"FROM demo "
"ORDER BY Name ";
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 获取查询结果
while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("Name ", sItem1);
recset.GetFieldValue("Age", sItem2);
// 移到下一行
recset.MoveNext();
}
// 关闭数据库
database.Close();
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;
}
4. 获取ODBC中Excel驱动的函数
CString CRWExcel::GetExcelDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
char *pszBuf = szBuf;
CString sDriver;
// 获取已安装驱动的名称(涵数在odbcinst.h里)
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
return "";
// 检索已安装的驱动是否有Excel...
do
{
if (strstr(pszBuf, "Excel") != 0)
{
//发现 !
sDriver = CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf, ''\0'') + 1;
}
while (pszBuf[1] != ''\0'');
return sDriver;
}
注意添加头文件! 还有就是数据源一定的配一下。因为无论是access 还是sql等其他数据库,它们在安装过程中就给服务器机器安装和配置了数据源。要想使用功能,还的花点心思!
3. C# 如何将EXCEL插入到数据库
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Data;
usingSystem.Collections;
usingSystem.Windows.Forms;
usingSystem.Data.OleDb;
usingSystem.Data.Common;
usingSystem.Data.SqlClient;
publicpartialclassExcel导入_Default:System.Web.UI.Page
{
privatestaticstringfilename;
privatestaticstringsavePath;
privatestaticDataSetds;//要插入的数据
privatestaticDataTabledt;
protectedvoidPage_Load(objectsender,EventArgse)
{
}
//上传文件到指定的服务器
protectedvoidButton1_Click1(objectsender,EventArgse)
{
filename=this.fileUploadExcel.FileName;
//savePath必须包含表名在内的所有路径名
savePath=@"G:项目组文件项目.net学习资料工程HealthExcel导入Files"+this.fileUploadExcel.FileName;//上传服务器文件的存储,存在当前新建的文件夹
this.fileUploadExcel.SaveAs(savePath);
Booleanjudge_excel=Judge_Excel();
if(!judge_excel)
{
MessageBox.Show("上传的不是excel文件","标题",MessageBoxButtons.OKCancel,MessageBoxIcon.Error);
return;
}
else
MessageBox.Show("上传文件成功","标题",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);
//测试,将excel中的sheet1导入到sqlserver中
//stringconnString="server=localhost;uid=sa;pwd=sqlgis;database=master";
//System.Windows.Forms.OpenFileDialogfd=newOpenFileDialog();
//if(fd.ShowDialog()==DialogResult.OK)
//{
////TransferData(fd.FileName,"sheet1",connString);
//}
}
//判断文件是否是excel文件函数
protectedBooleanJudge_Excel()
{
stringfileExtend=System.IO.Path.GetExtension(this.fileUploadExcel.FileName);
if(fileExtend==".xlsx"||fileExtend==".xls")
returntrue;
else
returnfalse;
}
//获取excel数据按钮的触发,
protectedvoidButton2_Click(objectsender,EventArgse)
{
ExcelToDataSet();
MessageBox.Show("获取数据成功","标题",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);
}
//从excel表中获取数据的函数
publicvoidExcelToDataSet()
{
stringstrConn="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+savePath+";ExtendedProperties="Excel8.0;HDR=Yes;IMEX=1"";
OleDbConnectionconn=newOleDbConnection(strConn);//连接excel
if(conn.State.ToString()=="Open")
{
conn.Close();
}
conn.Open();//外部表不是预期格式,不兼容2010的excel表结构
strings=conn.State.ToString();
OleDbDataAdaptermyCommand=null;
ds=null;
/*DataTableyTable=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,newObject[]{null,null,null,"TABLE"});//获取表的框架,几行几列
stringtableName=yTable.Rows[0]["filename"].ToString();//表示的是几行几列
stringstrSel="select*from["+filename+"]";//xls*/
stringstrExcel="select*from[sheet1$]";//如果有多个sheet表时可以选择是第几张sheet表
myCommand=newOleDbDataAdapter(strExcel,conn);//用strExcel初始化myCommand,查看myCommand里面的表的数据??
ds=newDataSet();
myCommand.Fill(ds);//把表中的数据存放在ds(dataSet)
conn.Close();
try
{
dt=ds.Tables[0];
this.dataGridView1.DataSource=dt;
}
catch(Exceptionerr)
{
MessageBox.Show("操作失败!"+err.ToString());
}
}
//excel导入数据库sql的按钮触发
protectedvoidButton3_Click(objectsender,EventArgse)
{
//stringpath=@"D:数据库SQLServerMSSQL10_50.MSSQLSERVERMSSQLDATATest.mdf";
stringconnString="server=localhost;uid=sa;pwd=1234;database=Test";//连接数据库的路径方法
//StringconnString=@"server=localhost;uid=sa;pwd=1234;database=D:数据库SQLServerMSSQL10_50.MSSQLSERVERMSSQLDATATest.mdf";
SqlConnectionconn=newSqlConnection(connString);
conn.Open();
DataRowdr=null;
intC_Count=dt.Columns.Count;//获取列数
for(inti=0;i<dt.Rows.Count;i++)//记录表中的行数,循环插入
{
dr=dt.Rows[i];
insertToSql(dr,C_Count,conn);
}
conn.Close();
if(dataGridView1.Rows.Count>0)//把数据库表中的数据显示到表中,可判断有没有数据
{
MessageBox.Show("导入成功!");
}
else
{
MessageBox.Show("没有数据!");
}
}
//使用bcp,不容易出错而且效率高
/*try
{
using(System.Data.SqlClient.SqlBulkCopybcp=newSystem.Data.SqlClient.SqlBulkCopy(connString))
{
bcp.SqlRowsCopied+=newSystem.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize=100;//每次传输的行数
bcp.NotifyAfter=100;//进度提示的行数
bcp.DestinationTableName=savePath;//目标表
bcp.WriteToServer(ds.Tables[0]);
}
}
catch
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}*/
//插入数据库的函数
protectedvoidinsertToSql(DataRowdr,intcolumn_count,SqlConnectionconn)
{
//excel表中的列名和数据库中的列名一定要对应
stringname=dr[0].ToString();//需要把内个列都列出来
stringage=dr[1].ToString();
stringsex=dr[2].ToString();
//当数据库中有多个表时,怎么分辨插入的表
stringsql="insertinto客户values('"+name+"','"+age+"','"+sex+"')";
SqlCommandcmd=newSqlCommand(sql,conn);
cmd.ExecuteNonQuery();
}
//从excel表中获取数据并存在
//protectedvoidImportFromExcel()
//{
//stringexecelConnectionStr=@"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=filename;
//ExtendedProperties=""Excel8.0;HDR=YES;IMEX=1""";//表第一行是标题,不做为数据使用,Excel档案只能用来做“读取”用途。
//ds=newDataSet();
//stringconnString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="
//+savePath+";ExtendedProperties="Excel8.0;HDR=Yes;IMEX=1"";
//DataTabletable=OleDbHelper.GetExcelTables(connString);
//if(table==null||table.Rows.Count<=0)
//{
//return;
//}
//foreach(DataRowdrintable.Rows)
//{
//stringcmdText="select*from["+dr["TABLE_NAME"].ToString()+"]";
//DataTabledt=OleDbHelper.FillDataTable(connString,cmdText);
//dt.TableName=dr["TABLE_NAME"].ToString();
//ds.Tables.Add(dt);
//}
//}
}
4. c语言 excel导入导出
C++、VC、VS、.net里都可通过数据库连接、捆绑后再调用,前提是你安装了相应版本的excel服务包(一般安装Office时都会自动装好,只是版本别选错,没有安装的,自己找找吧)。
用标准C语言很难,因为excel的格式不固定,要检测的东西很多,不建议用标C。