COleSafeArray型变量如何在Excel单元格内写入多行数据
使用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!"));