3,245
社区成员
发帖
与我相关
我的任务
分享
//插入表头 设置表头为固定 设置列宽为listctrl 列宽
for (i = 0; i < listItemInfo.TotalCloum; i++) //列
{
range = worksheet.get_Range(COleVariant(IndexToString(1, i + 1)), COleVariant(IndexToString(1, i + 1)));//第1行 第i+1列
curPos = i;
/* Excel的列宽的数值表示这一列所能容纳的数字字符个数。
列宽设置 的数字为0~255之间,即列宽最大限制为255个字符,最小为0,
当设置为0时,即隐藏该列。
*/
if (listItemInfo.vColumnWidth[i] > 255)
{
range.put_ColumnWidth(_variant_t((long)255));
}
else
{
range.put_ColumnWidth(_variant_t((long)listItemInfo.vColumnWidth[i]));
}
range.put_Value2(COleVariant(listItemInfo.vContent[curPos]));
}
#include "CApplication.h"
#include "CWorkbooks.h"
#include "CWorkbook.h"
#include "CWorksheets.h"
#include "CWorksheet.h"
#include "CRange.h"
BOOL SaveToFile::ExportToExcel()
{
if (listItemInfo.TotalRow > 0)
{
CString sPathName; //FULL-PATH
CString sFileExt = _T(".xlsx");
CString sContent = _T("null");
///默认文件名
if (!IsFileExists(sFileExt, sPathName))
{
return FALSE;
}
//整体结构 CApplication-》CWorkbooks-》CWorkbook -》CWorksheets-》CWorksheet-》CRange
CApplication ExcelApp; //excel.exe Excel应用程序接口
CWorkbooks workbooks; //多个工作薄
CWorkbook workbook; //工作薄
CWorksheets worksheets; //多个工作表
CWorksheet worksheet; //工作表
CRange range; //单元格 , Excel中针对单元格的操作都应先获取其对应的Range对象
/* COleVariant类为VARIANT数据类型的包装,
在自动化程序中,通常都使用VARIANT数据类型进行参数传递。
故下列程序中,函数参数都是通过COleVariant类来转换。*/
//covOptional 可选参数的VARIANT类型
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
long i = 0; //列
long j = 0; //行
int curPos = 0; //当前位置
if (!ExcelApp.CreateDispatch(_T("Excel.Application")))
{
return FALSE;
}
ExcelApp.put_DisplayAlerts(FALSE);
//获取工作薄集合
workbooks.AttachDispatch(ExcelApp.get_Workbooks());
//添加一个工作薄
workbook.AttachDispatch(workbooks.Add(covOptional), TRUE);
//获取工作表集合
worksheets.AttachDispatch(workbook.get_Worksheets(), TRUE);
//获取第一个工作表
worksheet.AttachDispatch(worksheets.get_Item(COleVariant((short)1)));
worksheet.put_Name(_T("table1"));
//插入表头 设置表头为固定 设置列宽为listctrl 列宽
for (i = 0; i < listItemInfo.TotalCloum; i++) //列
{
range = worksheet.get_Range(COleVariant(IndexToString(1, i + 1)), COleVariant(IndexToString(1, i + 1)));//第1行 第i+1列
curPos = i;
range.put_Value2(COleVariant(listItemInfo.vContent[curPos]));
}
//插入数据
range = worksheet.get_Range(COleVariant(IndexToString(2, 1)), COleVariant(IndexToString(listItemInfo.TotalRow, listItemInfo.TotalCloum)));
for (i = 1; i <= listItemInfo.TotalRow; i++) //行
{
for (j = 0; j < listItemInfo.TotalCloum; j++) //列
{
curPos = i * listItemInfo.TotalCloum + j;
range.put_Item(_variant_t((long)i), _variant_t((long)(j + 1)), COleVariant(listItemInfo.vContent[curPos]));
}
}
//设置列宽为自动适应
CRange cols = range.get_EntireColumn();
cols.AutoFit();
//显示表格
//ExcelApp.put_Visible(TRUE);
//保存文件
workbook.SaveAs(COleVariant(sPathName), covOptional, covOptional, covOptional, covOptional, covOptional, (long)0, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
//释放对象(相当重要!)
range.ReleaseDispatch();
worksheet.ReleaseDispatch();
worksheets.ReleaseDispatch();
workbook.ReleaseDispatch();
workbooks.ReleaseDispatch();
//退出程序
ExcelApp.Quit();
//m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
ExcelApp.ReleaseDispatch();
}
else
{
return FALSE;
}
return TRUE;
}
#include "CWindow0.h"
//冻结首行
window0.AttachDispatch(ExcelApp.get_ActiveWindow());
window0.put_SplitRow(_variant_t((long)1));
window0.put_FreezePanes(TRUE);
非常感谢 成功解决