关于CSpreadSheet

abinxm 2009-10-20 11:50:48
一堆的acsii同unicode的问题解决后好不容易能用 CSpreadSheet 问题又来了
出现中文的时候读不出来
然后第一行第一列的值怎么读都是 F1 郁闷了
请教下各位都是如何解决的~
...全文
1226 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
abinxm 2009-10-20
  • 打赏
  • 举报
回复
CSpreadSheet 处理excel的~
代码如下:中文读不出来~第一行第一列永远为 F1

CSpreadSheet SS(strExcelFilename, strExcelSheetName,false);
CStringArray Rows, Column;
int iTotalRowNum = SS.GetTotalRows();

for (int i = 1; i <= iTotalRowNum;i++)
{
// 读取一行
SS.ReadRow(Rows, i);
CString strContents = _T("");
int iTmpRowSize = Rows.GetSize();
for (int j = 1; j <= iTmpRowSize; j++)
{
if(j == 1)
strContents = Rows.GetAt(j-1);
else
strContents = strContents + _T(" --> ") + Rows.GetAt(j-1);

TRACE(_T("******************* value:") + strContents + '\n' );
}

//m_AccessList.AddString(strContents);
}
muzizongheng 2009-10-20
  • 打赏
  • 举报
回复
没听过这个类, 不给代码怎么看??
zhoukebuaa 2009-10-20
  • 打赏
  • 举报
回复
用OFFICE AUTOMATION吧,
感觉那样操作起来比用这个类简单些,
很清楚自己到底做了些什么,
whs1980 2009-10-20
  • 打赏
  • 举报
回复
这不是问题
问题是多个不同版本不好处理。
总之,没有十全十美的解决方案,除非自己去读XLS文件,然后解析出来。
abinxm 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 whs1980 的回复:]
office automation
[/Quote]

這個東西是不是依賴性蠻大的,我看他源碼還有引用那個 excel.exe文件~如果程序放到別人電腦~安裝的excel的位置不一樣~不就不能用了??
whs1980 2009-10-20
  • 打赏
  • 举报
回复
office automation
abinxm 2009-10-20
  • 打赏
  • 举报
回复
那請問一下還有沒其他方式來讀取excel~或者有什么庫可以用~
whs1980 2009-10-20
  • 打赏
  • 举报
回复
这就是SPREEDSHEET的局限,
它底层用的是DAO,所以把第一行当作字段列来处理了,就像数据库中的字段一样,所以你在第一行里的处理就必须小心,不能有特殊的DAO不能识别为字段的字符.
检查你的XLS文件吧,
abinxm 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 abinxm 的回复:]
引用 5 楼 whs1980 的回复:
UNICODE的,希望你能用
底层就是DAO,读数据的处理有一定的局限.



您提供的代碼是OK的~中文可以讀出~但是有個問題~第一行的第二列的值永遠是 F2

剛才用網絡上下的CSpreadSheet是第一行第一列永遠是 F1~

我暈了~~~~HELP~~~
[/Quote]

不是數字就正常~全數字就變成F2了.....
abinxm 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 whs1980 的回复:]
UNICODE的,希望你能用
底层就是DAO,读数据的处理有一定的局限.

[/Quote]

您提供的代碼是OK的~中文可以讀出~但是有個問題~第一行的第二列的值永遠是 F2

剛才用網絡上下的CSpreadSheet是第一行第一列永遠是 F1~

我暈了~~~~HELP~~~
whs1980 2009-10-20
  • 打赏
  • 举报
回复
UNICODE的,希望你能用
底层就是DAO,读数据的处理有一定的局限.
whs1980 2009-10-20
  • 打赏
  • 举报
回复
// SpreadSheetEx.cpp: implementation of the CSpreadSheetEx class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SpreadSheetEx.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSpreadSheetEx::CSpreadSheetEx(LPCTSTR lpszFile)
{
m_strFileFullPath = lpszFile;
m_strSeperate = L"¢¦";
//获得dsn
GetExcelDriver();
m_Database = new CDatabase;
m_sDsn.Format(L"DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s", m_sExcelDriver, lpszFile, lpszFile);
OpenDB();
}

CSpreadSheetEx::~CSpreadSheetEx()
{
m_arrRows.RemoveAll();
if (m_Database != NULL)
{
m_Database->Close();
delete m_Database;
}
}

// Get the name of the Excel-ODBC driver
void CSpreadSheetEx::GetExcelDriver()
{
TCHAR szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
TCHAR *pszBuf = szBuf;

// Get the names of the installed drivers (L"odbcinst.h" has to be included )
if(!SQLGetInstalledDriversW(szBuf,cbBufMax,& cbBufOut))
{
m_sExcelDriver = L"";
return;
}

// Search for the driver...
do
{
if( wcsstr( pszBuf, L"Excel" ) != 0 )
{
// Found !
m_sExcelDriver = CString( pszBuf );
break;
}
pszBuf = wcschr( pszBuf, '\0' ) + 1;
}
while( pszBuf[1] != '\0' );
}

BOOL CSpreadSheetEx::OpenDB()
{
if(m_Database->IsOpen())
return true;
try
{
m_Database->OpenEx(m_sDsn, CDatabase::noOdbcDialog);
}
catch(...)
{
return false;
}
return true;
}
/*
* 创建表lpszSheetName
*/
BOOL CSpreadSheetEx::AddHeaders(LPCTSTR lpszSheetName, CStringArray &arrHeaders)
{
m_strColumns.Empty();
m_strSheetName = lpszSheetName;
//转化表名中的空格
m_strSheetName.Replace(' ','_');
if(OpenDB())
{
CString strSql;
strSql.Format(L"CREATE TABLE [%s] (", m_strSheetName);
for (int i = 0; i < arrHeaders.GetSize(); i++)
{
strSql = strSql + "[" + arrHeaders.GetAt(i) +"]" + " char(255), ";
if(!m_strColumns.IsEmpty())
m_strColumns += L",";
m_strColumns += L"[";
m_strColumns += arrHeaders.GetAt(i);
m_strColumns += L"]";
}
strSql.Delete(strSql.GetLength()-2, 2);
strSql += ")";

try
{
m_Database->ExecuteSQL(strSql);
}
catch(CDBException *e)
{
m_strLastError = e->m_strError;
return false;
}
return TRUE;
}
return FALSE;
}

/*
* 添加纪录
*/
BOOL CSpreadSheetEx::AddRow(CStringArray &arrRow)
{
CString strSql;
strSql.Format(L"INSERT INTO [%s$A1:IV65535] (%s) values(", m_strSheetName,m_strColumns);
CString strValue ;
for (int j = 0; j < arrRow.GetSize(); j++)
{
strValue = arrRow.GetAt(j);
strValue.Replace(L"'",L"''");

if(j>0)
strSql += L",";
strSql += L"'";
strSql += strValue;
strSql += L"'";
}
// strSql.Delete(strSql.GetLength()-1, 1);
strSql += ")";

// Add row
try
{
if(OpenDB())
{
m_Database->ExecuteSQL(strSql);
return true;
}
}
catch(CDBException *e)
{
m_strLastError = e->m_strError;
return false;
}
return false;
}

BOOL CSpreadSheetEx::OpenSheet(LPCTSTR lpszSheetName)
{
m_iIndexRow = 0;
m_lTotalColumns = 0;
m_lTotalRows = 0;
m_arrRows.RemoveAll();

if(!OpenDB())
{
return FALSE;
}
try
{
CString strSql;
m_rSheet = new CRecordset( m_Database );
strSql.Format(L"SELECT * FROM [%s$A1:IV65536]", lpszSheetName);
m_rSheet->Open(CRecordset::forwardOnly, strSql, CRecordset::readOnly);
m_lTotalColumns = m_rSheet->m_nResultCols;
if(m_lTotalColumns>0)
{
CString strValue;
CString strRow;
for(short column=0;column<m_lTotalColumns;column++)
{
strRow += m_rSheet->m_rgODBCFieldInfos[column].m_strName;
strRow += m_strSeperate;
}
m_arrRows.Add(strRow);//列头
m_lTotalRows++;

while (!m_rSheet->IsEOF())
{
m_lTotalRows++;
strRow.Empty();
for (int column = 0; column < m_lTotalColumns; column++)
{
m_rSheet->GetFieldValue(column, strValue);
strRow += strValue;

strRow += m_strSeperate;
}
// Store the obtained row in memory
m_arrRows.Add(strRow);
m_rSheet->MoveNext();
}
}
}
catch(...)
{
m_rSheet->Close();
delete m_rSheet;
m_rSheet = NULL;
return false;
}

m_rSheet->Close();
delete m_rSheet;

return true;
}

BOOL CSpreadSheetEx::GetRow(CStringArray &arrRow, int iRow)
{
int iIndexRow = iRow;
if(iIndexRow<=0)
{
iIndexRow = m_iIndexRow;
}
if(iIndexRow>=m_lTotalRows)
{
iIndexRow = m_lTotalRows-1;
}
m_iIndexRow = iIndexRow;//游标到当前行
int iSepLength = m_strSeperate.GetLength();

CString strRow = m_arrRows.GetAt(m_iIndexRow);
int iPos = strRow.Find(m_strSeperate);
while (iPos!=-1)
{
arrRow.Add(strRow.Left(iPos));
strRow = strRow.Mid(iPos+iSepLength);
iPos = strRow.Find(m_strSeperate);
}
m_iIndexRow++;

return TRUE;
}

int CSpreadSheetEx::GetRowCounts()
{
return m_lTotalRows;
}
whs1980 2009-10-20
  • 打赏
  • 举报
回复
// SpreadSheetEx.h: interface for the CSpreadSheetEx class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SPREADSHEETEX_H__9376FC29_1D96_46D7_8C44_A96C7230F36A__INCLUDED_)
#define AFX_SPREADSHEETEX_H__9376FC29_1D96_46D7_8C44_A96C7230F36A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "odbcinst.h"
#include <afxdb.h>
/*
* 写操作
1.调用构造函数 CSpreadSheetEx(LPCTSTR lpszFile);
2.调用创建sheet的方法 AddHeaders(LPCTSTR lpszSheetName,CStringArray &arrHeaders);
3.添加行 AddRow(CStringArray &arrRow);

读操作
1.构造函数 CSpreadSheetEx(LPCTSTR lpszFile);
2.获得excel表中所有的数据并存放到m_arrRows中 OpenSheet(LPCTSTR lpszSheetName);
3.获得记录的个数 GetRowCounts();
4.for循环获得每行的值 GetRow(CStringArray &arrRow,int iRow=0);
*/
class CSpreadSheetEx
{
public:
int GetRowCounts();
BOOL GetRow(CStringArray &arrRow,int iRow=0);
BOOL OpenSheet(LPCTSTR lpszSheetName);
BOOL AddRow(CStringArray &arrRow);
CString m_strLastError;
BOOL AddHeaders(LPCTSTR lpszSheetName,CStringArray &arrHeaders);
CSpreadSheetEx(LPCTSTR lpszFile);
virtual ~CSpreadSheetEx();
private:
int m_iIndexRow;
CString m_strSeperate;
CStringArray m_arrRows;//所有的信息 每一行信息为一条纪录 中间用分隔符 "@||@" 分隔
long m_lTotalRows;
long m_lTotalColumns;
BOOL OpenDB();
CString m_sExcelDriver; // DSN string to open Excel spreadsheet for reading and writing
CString m_sDsn;
CDatabase *m_Database; // Database variable for Excel spreadsheet
CRecordset *m_rSheet; // Recordset for Excel spreadsheet
CString m_strColumns;
CString m_strFileFullPath;
CString m_strSheetName;

void GetExcelDriver();
// BOOL open()

};

#endif // !defined(AFX_SPREADSHEETEX_H__9376FC29_1D96_46D7_8C44_A96C7230F36A__INCLUDED_)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧