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。