MFC中生成一个Excel,怎么设置Excel表格首行冻结

Alex_Lan 2016-12-13 03:47:32
如题
我是vs2015 office 2016
	//插入表头 设置表头为固定 设置列宽为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]));
}
...全文
361 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
api16301 2019-10-21
  • 打赏
  • 举报
回复
帮助到我了,谢谢!
zgl7903 2016-12-14
  • 打赏
  • 举报
回复
这里的Window类不是API的类 是 Office 的一个接口 https://msdn.microsoft.com/en-us/library/office/ff841228.aspx 导入EXCEL类的时候应该 可以选择
Alex_Lan 2016-12-14
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
有没有引入 Window 类? FreezePanes 是 Window 类中的方法
引入了window.H 也不能用啊 我查msdn也查不到
Alex_Lan 2016-12-14
  • 打赏
  • 举报
回复
#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;
}
引用 6 楼 zgl7903 的回复:
有没有引入 Window 类? FreezePanes 是 Window 类中的方法
zgl7903 2016-12-14
  • 打赏
  • 举报
回复
有没有引入 Window 类? FreezePanes 是 Window 类中的方法
Alex_Lan 2016-12-14
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
这里的Window类不是API的类 是 Office 的一个接口 https://msdn.microsoft.com/en-us/library/office/ff841228.aspx 导入EXCEL类的时候应该 可以选择
#include "CWindow0.h"
		//冻结首行
		window0.AttachDispatch(ExcelApp.get_ActiveWindow());
		window0.put_SplitRow(_variant_t((long)1));
		window0.put_FreezePanes(TRUE);
非常感谢 成功解决
Alex_Lan 2016-12-13
  • 打赏
  • 举报
回复
好痛苦啊 没有其他办法了吗
Alex_Lan 2016-12-13
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
Excel 中录制的宏 Range("A2").Select ActiveWindow.FreezePanes = True VS中差不多是 worksheet.get_Range("A2", "A2").Select(); AppXL.GetActiveWindow()->FreezePanes = true;
完全没找到freezepanes
zgl7903 2016-12-13
  • 打赏
  • 举报
回复
Excel 中录制的宏 Range("A2").Select ActiveWindow.FreezePanes = True VS中差不多是 worksheet.get_Range("A2", "A2").Select(); AppXL.GetActiveWindow()->FreezePanes = true;
Alex_Lan 2016-12-13
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
录制宏, 手动操作EXCEL, 按宏编辑代码
在VS中? 我需要生成的这个Excel默认首行冻结 ,不是生成之后打开再设置
zgl7903 2016-12-13
  • 打赏
  • 举报
回复
录制宏, 手动操作EXCEL, 按宏编辑代码

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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