COleSafeArray型变量如何在Excel单元格内写入多行数据

smcrescent 2010-02-12 11:44:20
使用COleSafeArray型变量来输出Excel,创建时声明为二维数组,二维中每一项对应sheet页中的一个单元格,想在一个单元格中写入多行数据,但是测试发现写入14行还好用,但是15行的时候程序就发生错误了,弹出一个错误消息框,哪位高人知道如何在COleSafeArray的某一项中写入大量数据来输出excel。

以下为程序源代码

需要倒入excel.cpp,excel.h才能运行

COleSafeArray saRet[2];
int m_iNumRows;
int m_iNumCols;
CString m_sStartingCell;
bool m_bFillWithStrings;
DWORD numElements[2];

m_iNumRows = 5;
m_iNumCols = 3;
m_sStartingCell = _T("A3");
m_bFillWithStrings = true;
numElements[0]= m_iNumRows; //Number of rows in the range.
numElements[1]= m_iNumCols; //Number of columns in the range.

_Application m_appExcel;

if( !m_appExcel.CreateDispatch("Excel.Application") )
{
this->MessageBox("can't create Excel");
return;
}
Workbooks books; // excel exit
_Workbook book; // excel save
Worksheets sheets; // excel sheets
_Worksheet sheet_Seq; // Excel_Sequencen sheet
_Worksheet sheet_Od; // Excel_Sequence sheet
_Worksheet sheet; // other sheet
CString sText = _T(""); // comment
Range m_ExlRge; // excel range
LineFormat olineformat; // line format
COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); // sheet
LPDISPATCH lpDisp;
books = m_appExcel.GetWorkbooks();
book = books.Add(vOpt);

// set name
sheets = book.GetSheets();
sheet_Seq = sheets.GetItem(COleVariant((short)1));
sheet_Seq.SetName(_T("Excel_Sequence"));
m_ExlRge = sheet_Seq.GetCells();
Range row = m_ExlRge.GetEntireColumn(); // set line height
row.SetColumnWidth(COleVariant((double)15));
row = m_ExlRge.GetEntireRow();
row.SetRowHeight(COleVariant((double)11.25));

m_ExlRge = sheet_Seq.GetCells();
int nCol = 6; // current column
int nRow = 2;
CString sRType = _T("aaa");
if(m_bFillWithStrings)
{
saRet[0].Create(VT_BSTR, 2, numElements);

}
else
{
}

//Fill the SAFEARRAY.
long index[2];
long iRow;
long iCol;

range = sheet_Seq.GetRange(COleVariant(m_sStartingCell), COleVariant(m_sStartingCell));
range = range.GetResize(COleVariant((short)(m_iNumRows)), COleVariant((short)(m_iNumCols)));

//*** Fill the range with an array of values.


for(iRow=0;iRow<=m_iNumRows-1;iRow++)
{
for(iCol=0;iCol<=m_iNumCols-1;iCol++)
{
index[0] = iRow;
index[1] = iCol;
VARIANT v;
CString s;
VariantInit(&v);
v.vt = VT_BSTR;
s = _T("");
v.bstrVal = s.AllocSysString();
saRet[0].PutElement(index, v.bstrVal);
SysFreeString(v.bstrVal);
VariantClear(&v);
}
}


CString s = _T(" TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n\
TTTTTTT:Security Mode Command TTTTTTT: 56\n");

for(iRow=0;iRow<=m_iNumRows-1;iRow++)
{
for(iCol=0;iCol<=m_iNumCols-1;iCol++)
{
index[0] = iRow;
index[1] = iCol;
VARIANT v;
VariantInit(&v);
v.bstrVal = s.AllocSysString();
saRet[0].PutElement(index, v.bstrVal);
SysFreeString(v.bstrVal);
VariantClear(&v);
}
}
//Set the range value to the SAFEARRAY.

range.SetValue2(COleVariant(saRet[0]));
range.SetValue2(COleVariant(saRet2));*/

saRet[0].Detach();
book.SaveAs(COleVariant(_T("f:\\a.xls")), vOpt, vOpt, vOpt, vOpt, vOpt, 0, vOpt, vOpt, vOpt, vOpt, vOpt);
book.Close(vOpt, COleVariant(vOpt), vOpt);
books.Close();
m_appExcel.Quit();


m_appExcel.SetIgnoreRemoteRequests(FALSE);
m_ExlRge.ReleaseDispatch();
row.ReleaseDispatch();
sheet_Seq.ReleaseDispatch();
sheet_Od.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
m_appExcel.ReleaseDispatch();
AfxMessageBox(_T("OK!"));
...全文
454 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
smcrescent 2010-02-21
  • 打赏
  • 举报
回复
引用 2 楼 sjdev 的回复:
是什么错误呢?

程序死掉了 也没有什么异常...
xwsn007 2010-02-13
  • 打赏
  • 举报
回复
占个座
再占个座
再再占个座
(csdn搞的臭规矩,一点都不务实)
sjdev 2010-02-12
  • 打赏
  • 举报
回复
是什么错误呢?
corn8888 2010-02-12
  • 打赏
  • 举报
回复
工作顺利 万事如意!

16,472

社区成员

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

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

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