最后80分求助:如何将ListCtrl控件中的数据导入到Excel中,请帮忙,急……

pjfwho 2005-07-18 03:24:57
VC/MFC Dialog项目,开发WinForm

现在想要将ListCtrl控件中显示出来的数据导入到指定的Excel文件中,有什么办法可以实现啊?请指点……

领导催的比较急,小弟又没有做过这方面的东西,麻烦大侠给一个具体的例子,谢谢!

可以的话,请发到我邮箱中:pjf.who@163.com 或者 Admin@Hotheart-china.com

学习,关注……
...全文
1240 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
BuZhang_AP97091 2005-07-23
  • 打赏
  • 举报
回复
很懒,就不想动脑子,就想得现成的代码来用。看看VCKBASE.COM的示例程序
sf612 2005-07-23
  • 打赏
  • 举报
回复
humourHM(小鬼)
你程序中这一段什么意思啊

CFileDialogFileDialog(FALSE,//Save;
"xls",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Microsoft Excel 2000 (*.xls)|*.xls|所有文件(*.*)|*.*||",this);
if(FileDialog.DoModal()!=IDOK)
return;
CStringstrFile=FileDialog.GetPathName();
if(::PathFileExists(strFile))
DeleteFile(strFile);

能给我个可以编译的完整例子吗 sf612@sina.com.cn 谢谢
AntonlioX 2005-07-21
  • 打赏
  • 举报
回复
直接用数据库实现就行了
humourHM 2005-07-21
  • 打赏
  • 举报
回复
_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;未定义的解决方法如下。
选择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library,选择D:\Program Files\Microsoft Office\office\Excel9.OLB(D:\Program Files\Microsoft Office\是本机上Microsoft Office 2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。然后将#include "Excel9.h"
加入到应用的地方。
由于我写的函数void CMyListCtrl::SaveToExcel()是LIST控件的一个函数。所以如果你放在按钮的响应中的话,在某些调用LIST的函数的地方前面要加上m_list.(比如GetHeaderCtrl();要改成m_list.GetHeaderCtrl();,GetItemText要改成m_list.GetItemText等等。
qrlvls 2005-07-21
  • 打赏
  • 举报
回复
void CMainFrame::OnExportExcel()
{
_Application *pExcelApp;
Workbooks objExcelBooks;
Sheets objExcelSheets;
_Workbook objWorkBook;
_Worksheet objWorkSheet;

COleVariant varOptional(DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant varTrue((short)TRUE);
COleVariant varFalse((short)FALSE);
int nMaxRows;
CString strText;

pExcelApp = new _Application;
pExcelApp->CreateDispatch(_T("Excel.Application")); // 创建 Excel 应用程序
objExcelBooks = pExcelApp->GetWorkbooks();\
objExcelSheets = objExcelBooks.Add(varOptional);
objWorkBook.AttachDispatch(pExcelApp->GetApplication());
objExcelSheets = objWorkBook.GetSheets();
objWorkSheet = objExcelSheets.GetItem(COleVariant((short)1));
objWorkSheet.Activate();

nMaxRows = g_pView->GetItemCount();

for (int nCol=0; nCol<DBF_COLUMN_NUM; nCol++)
{
__ExcelWriteCell(objWorkSheet, 1, nCol+1, g_szColumnName[nCol], 1, 1, 1);
}
for (int nRow = 0; nRow<nMaxRows; nRow++)
{
for (int nCol = 0; nCol<DBF_COLUMN_NUM; nCol++)
{
strText = g_pView->GetItemText(nRow, nCol);
if (nCol == 0 || nCol == 2 || nCol == 16)
strText = _T("'") + strText;

__ExcelWriteCell(objWorkSheet, nRow+2, nCol+1, strText, 1, 1, 1);
}
strText.Format(_T("正在导出: %u - %u"), nMaxRows, nRow);
// m_wndStatusBar.SetInformation(strText, RGB(0, 0, 255));
SetWindowText(strText);
}
pExcelApp->SetVisible(TRUE); // 显示 Excel 应用程序
m_wndStatusBar.SetInformation(_T("导出Excel数据完成"), RGB(0, 80, 0));

// objWorkBook.SetSaved(TRUE);
// objExcelBooks.Close();
delete pExcelApp;
}
qrlvls 2005-07-21
  • 打赏
  • 举报
回复
为偶GF写的一个小工具中的代码:
//---------------------------------------------------------------------
// 描 述: 设置指定 Worksheet 中的表格文本
//---------------------------------------------------------------------
void CMainFrame::__ExcelWriteCell(_Worksheet &objWorkSheet, int nRow, int nCol, CString strText, int nHeight, int nWidth, int nAlignment)
{
Range objRange;
CString strCellFrom;
CString strCellTo;
COleVariant varOptional(DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant varFalse((short)FALSE);

int nColFrom, nRowFrom;
int nColTo, nRowTo;

nRowFrom = nRow;
nRowTo = nRowFrom + nHeight - 1;

nColFrom = nCol;
nColTo = nColFrom + nWidth - 1;

ASSERT(nRowFrom > 0 && nRowTo >= nRow);
ASSERT(nColFrom > 0 && nColTo >= nCol);

__ExcelGetCellName(nRowFrom, nColFrom, strCellFrom);
__ExcelGetCellName(nRowTo, nColTo, strCellTo);

objRange = objWorkSheet.GetRange(COleVariant(strCellFrom), COleVariant(strCellTo));
if (nWidth>1 || nHeight>1)
objRange.Merge(COleVariant((short)0));
objRange.SetWrapText(varFalse);
objRange.SetValue(COleVariant(strText));
objRange.BorderAround(COleVariant((short)1), (long)2, (long)1, varOptional);
objRange.SetHorizontalAlignment(COleVariant((short)nAlignment));
objRange.SetVerticalAlignment(COleVariant((short)2));
objRange.SetColumnWidth(COleVariant((short)10));
}

//---------------------------------------------------------------------
// 描 述: 根据行列计算Excel单元格名称
//---------------------------------------------------------------------
void CMainFrame::__ExcelGetCellName(int nRow, int nCol, CString &strName)
{
int nSeed = nCol;
CString strRow;

strName = _T("");

while (nSeed > 0)
{
strName = (TCHAR)('A' + (nSeed-1)%26) + strName;
nSeed --;
nSeed /= 26;
}

strRow.Format(_T("%d"), nRow);
strName += strRow;
}

pjfwho 2005-07-21
  • 打赏
  • 举报
回复
to: humourHM(小鬼)
大哥,你的代码编译的时候出现错误!!

_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
错误信息为:即使使用参数相关的查找,也未找到标识符
horisly 2005-07-20
  • 打赏
  • 举报
回复
mark
humourHM 2005-07-19
  • 打赏
  • 举报
回复
该代码好象还比较通用,祝你早日交差,顺便赏点分给小弟:)
humourHM 2005-07-19
  • 打赏
  • 举报
回复
我以前作过。
自己派生了个ListCtrl控件。写了个函数,用来将控件中的数据保存到EXCEL中。
函数代码如下:
SaveToExcel()
{
CFileDialog FileDialog(FALSE,//Save;
"xls",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Microsoft Excel 2000 (*.xls)|*.xls|所有文件(*.*)|*.*||",this);
if(FileDialog.DoModal()!=IDOK)
return;
CString strFile=FileDialog.GetPathName();
if(::PathFileExists(strFile))
DeleteFile(strFile);
///////////////////////////////////////////
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
Font font;

// Start Excel and get Application object.
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Couldn't start Excel and get Application object.");
return;
}

//Get a new workbook.
books = app.GetWorkbooks();
book = books.Add (covOptional);

//Get the first sheet.
sheets =book.GetSheets();
sheet = sheets.GetItem(COleVariant((short)1));

CHeaderCtrl *pmyHeaderCtrl;
pmyHeaderCtrl=GetHeaderCtrl();//此句取得CListCtrl控件的列表頭

int iRow,iCol;
int m_cols = pmyHeaderCtrl->GetItemCount();
int m_rows=GetItemCount();
HDITEM hdi;
TCHAR lpBuffer[256];
bool fFound = false;

hdi.mask = HDI_TEXT;
hdi.pszText = lpBuffer;
hdi.cchTextMax = 256;
char name='A'-1;
CString colname;
for(iCol=0; iCol<m_cols; iCol++)//将列表的标题头写入EXCEL
{
name+=1;
colname.Format("%c1",name);
range = sheet.GetRange(COleVariant(colname),COleVariant(colname));
pmyHeaderCtrl->GetItem(iCol, &hdi);
range.SetValue(COleVariant(hdi.pszText));
int nWidth = GetColumnWidth(iCol)/6;
//得到第iCol+1列
range.AttachDispatch(range.GetItem(_variant_t((long)(iCol+1)),vtMissing).pdispVal,true);
//设置列宽
range.SetColumnWidth(_variant_t((long)nWidth));
}
range = sheet.GetRange(COleVariant("A1"), COleVariant(colname));
range.SetRowHeight(_variant_t((long)50));//设置第一行的高度
font = range.GetFont();
font.SetBold(covTrue);
range.SetVerticalAlignment(COleVariant((short)-4108)); //xlVAlignCenter = -4108

COleSafeArray saRet;
DWORD numElements[]={m_rows,m_cols}; //5x2 element array
saRet.Create(VT_BSTR, 2, numElements);
range = sheet.GetRange(COleVariant("A2"),covOptional);
range = range.GetResize(COleVariant((short)m_rows),COleVariant((short)m_cols));
long index[2];
range = sheet.GetRange(COleVariant("A2"),covOptional);
range = range.GetResize(COleVariant((short)m_rows),COleVariant((short)m_cols));
for ( iRow = 1; iRow <= m_rows; iRow++)//将列表内容写入EXCEL
{
for ( iCol = 1; iCol <= m_cols; iCol++)
{
index[0]=iRow-1;
index[1]=iCol-1;
CString szTemp;
szTemp=GetItemText(iRow-1,iCol-1);
BSTR bstr = szTemp.AllocSysString();
saRet.PutElement(index,bstr);
SysFreeString(bstr);
}
}
range.SetValue(COleVariant(saRet));
Interior cellinterior;
range = sheet.GetRange(COleVariant("A1"),covOptional);
range = range.GetResize(COleVariant((short)1),COleVariant((short)m_cols));
books=range.GetInterior();
cellinterior.AttachDispatch(books);
cellinterior.SetColorIndex(COleVariant((short)37));//设置EXCEL头一行的背景颜色
for( iRow=1; iRow <= m_rows; iRow++)//设置EXCEL其余的背景颜色(颜色交替变换)
{
int state=iRow%2;
CString index;
index.Format("A%d",iRow+1);
range = sheet.GetRange(COleVariant(index),covOptional);
range = range.GetResize(COleVariant((short)1),COleVariant((short)m_cols));
books=range.GetInterior();
cellinterior.AttachDispatch(books);
if(!state)
cellinterior.SetColorIndex(COleVariant((short)36));
else
cellinterior.SetColorIndex(COleVariant((short)24));
}
saRet.Detach();
book.SaveCopyAs(COleVariant(strFile));
cellinterior.ReleaseDispatch();
book.SetSaved(true);
book.ReleaseDispatch();
books.ReleaseDispatch();
app.Quit();
app.ReleaseDispatch();
}
legendhui 2005-07-19
  • 打赏
  • 举报
回复
这个有什么难的吗?直接用数据库实现不就行了?
Kudeet 2005-07-19
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=231
发了个简单例子
pjfwho 2005-07-19
  • 打赏
  • 举报
回复
没有人会吗???

请高手帮忙啊……
pjfwho 2005-07-19
  • 打赏
  • 举报
回复
简单?请给出一个例子啊!!!

16,467

社区成员

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

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

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