继前面写的文章后,继续写程序。
以这种方式实施时,需要使用GDIPlus开源库实现照片转换功能。因此,必须在VC开发环境中设置库路径。
GDIPlus下载地址:
下载完成后,只需解压缩到本地计算机的路径下即可
然后,从vc6.0导入GDIPlus开放源代码库
选择Vc6.0菜单栏“tool”-“options”,在弹出对话框中找到“Directories”选项卡,然后从“Show Directories for:”下拉框选项中选择“Include files”。
列表中出现空行。空行后面的“.”单击按钮导航到解压的GDIPlus文件夹中的“Include”文件夹,选择该文件夹,然后双击该文件夹完成添加“Include”文件夹。
切换“Show Directories for:”下拉框选项,选择“Library files”选项,在GDIPlus文件夹中找到Lib文件夹,然后双击以添加该文件夹。
选择Vc6.0菜单栏Project“-”Setting,在弹出对话框界面中找到Link选项卡,然后在Object/library modules:输入框中输入gdiplus。输入
打开“文件视图”视图,双击s文件将其打开,然后添加以下代码:
打开FileView视图,双击excelDemo1.h文件将其打开,然后添加以下代码:
打开FileView视图,双击ExcelDemo1.cpp文件将其打开,然后添加以下代码:
完成上述操作后,如果按键盘“F7”快捷键编译程序,您会发现Excel中的类型名称与GDIPlus中的类型名称冲突,并通过以下解决方法在编译时报告大量错误:
1.在“文件视图”视图中,双击《excel.h》文件将其打开,然后将代码添加到文件开头。
2、拖动滑块以设置文件末尾,并在文件末尾添加}符号。
c-image/2437dce9ba62494998089e0e87256b23?from=article.detail&_iz=31825&index=8" width="507" height="126"/>3、在“FileView”视图中双击《excel.cpp》文件打开,在文件中添加如下代码:
4、拖动滑块置文件的末尾处,在文件的末尾添加}符号:
5、在“FileView”视图中双击《XExcel.h》文件打开,在文件中添加如下代码:
完成上述步骤之后,重新点击键盘快捷键“F7”重新编译程序,类型名冲突的报错信息将会消失。
打开“FileView”视图,双击打开ExcelDemo1Dlg.h 文件,在文件中导入XExcel.h头文件,如下所示:
打开“ResourceView”视图,找到IDD_EXCELDEMO1_DIALOG对话框,双击打开该对话框,效果图如下所示:
双击对话框中的“确定”按钮,为“确定”按钮增加响应函数。操作完成后进入“确定”按钮实现函数处进行代码的编辑工作。
在这里我们首先为CExcelDemo1Dlg类添加一个成员函数,作为生成JPG图片方法的实现。
打开“FileView”视图,双击打开ExcelDemo1Dlg.h 文件,在类中添加
成员函数:
int SaveFile(Bitmap* pImage, const wchar_t* pFileName);
int SelectDirPath(CString& strDirPath);
int CreateJPGFile(const CString& strFilepath);
int CreateJPGByCliopBoard();
int bmpToJpg(const unsigned short* szBmpPath, const unsigned short* szJPGPath);
int GetEncoderClsid(const WCHAR* Format, CLSID* pClsid);
成员变量:
CString m_strSaveJPGDirPath;
打开“FileView”视图,双击打开ExcelDemo1Dlg.cpp 文件,实现成员函数的功能:
int CExcelDemo1Dlg::SaveFile(Bitmap* pImage, const wchar_t* pFileName) { EncoderParameters encoderParameters; CLSID jpgClsid; int nRet = GetEncoderClsid(L"image/jpeg", &jpgClsid); if (nRet < 0) { return -1; } encoderParame = 1; encoderParame[0].Guid = Encoderquality; encoderParame[0].Type = EncoderParameterValueTypeLong; encoderParame[0].NumberOfValues = 1; ULONG quality; quality = 100; encoderParame[0].Value = &quality; Status status = pImage->Save(pFileName, &jpgClsid, &encoderParameters); if (status != Ok) { return -1; } return 0; }
int CExcelDemo1Dlg::SelectDirPath(CString& strDirPath) { CWnd* pMainCWnd = NULL; pMainCWnd = GetActiveWindow(); HWND hWnd = pMainCWnd->GetSafeHwnd(); (); LPMALLOC lpMalloc; if (::SHGetMalloc(&lpMalloc) != NOERROR) return 0; char szDisplayName[_MAX_PATH]; char szBuffer[_MAX_PATH]; BROWSEINFO browseInfo; brow = hWnd; brow = NULL; brow = szDisplayName; brow = "选择一个文件夹"; brow = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; brow = NULL; brow = 0; LPITEMIDLIST lpItemIDList; if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo)) != NULL) { if (::SHGetPathFromIDList(lpItemIDList, szBuffer)) { if (szBuffer[0] == '\0') return 0; strDirPath = szBuffer; return 1; } else return 1; lpMalloc->free(lpItemIDList); lpMalloc->Release(); } return 1; }
int CExcelDemo1Dlg::CreateJPGFile(const CString& strFilepath) { CString strExcelPath = ""; CString strDirPath = ""; CString strSavePath = ""; CString strFileName = ""; int nPos = ("."); if (nPos > 0) { strFileName = (0, nPos); } ("%s%s", m_strSaveJPGDirPath, strFileName); m_ed(strDirPath); ("%s%s", strDirPath, strFilepath); CXExcel xExcel; i()<0) return -1; int nRet = xExcel.Open(strExcelPath); if (nRet < 0) { CString strMsg = ""; ("打开文件失败:%s", strExcelPath); AfxMessageBox(strMsg); xExcel.ExitApp(); } CString strBeginArea = "", strEndArea = ""; m_ed(strBeginArea); m_ed(strEndArea); if () || ()) { AfxMessageBox("请录入完整的截图区域!"); xExcel.ExitApp(); return -1; } BOOL bRet = xExcel.SaveExcelCellToPic(strBeginArea, strEndArea, strSavePath + ".bmp"); if (!bRet) { AfxMessageBox("生成图片失败!"); xExcel.ExitApp(); return -1; } unsigned short szBmpPath[MAX_PATH] = {0}; unsigned short szJpgPath[MAX_PATH] = {0}; MultiByteToWideChar(CP_ACP, 0, strSavePath + ".bmp", -1, szBmpPath, MAX_PATH); MultiByteToWideChar(CP_ACP, 0, strSavePath + ".jpg", -1, szJpgPath, MAX_PATH); nRet = BmpToJpg(szBmpPath, szJpgPath); if (nRet == 0) { ::DeleteFile(strSavePath + ".bmp"); } else { AfxMessageBox("图片转化失败!"); xExcel.ExitApp(); return -1; } xExcel.ExitApp(); return 0; }
int CExcelDemo1Dlg::CreateJPGByCliopBoard() { WIN32_FIND_DATA FindFileData; HANDLE hFindFile; CString strPath; m_ed(strPath); i()==0) return -1; CString strPathEx = strPath; CString strFileName = "";//文件名 CString strFile = ""; i(1)!="\\") strPathEx = strPath+ "\\"; strFile= strPathEx + "*.*"; ('\\', '/'); hFindFile = FindFirstFile(strFile, &FindFileData); if(hFindFile!=INVALID_HANDLE_VALUE) { do { if & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { continue; } strFileName = FindFileDa; if (strcm(4), ".xls") == 0 || strcm(5), ".xlsx") == 0) { CreateJPGFile(strFileName); } } while(FindNextFile(hFindFile, &FindFileData)); } FindClose(hFindFile); return 0; }
int CExcelDemo1Dlg::BmpToJpg(const unsigned short* szBmpPath, const unsigned short* szJPGPath) { int nRet = 0; Bitmap newbitmap(szBmpPath); nRet = SaveFile(&newbitmap,szJPGPath); return nRet; }
int CExcelDemo1Dlg::GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; UINT size = 0; ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0) return -1; pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j) { if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; } } free(pImageCodecInfo); return -1; }
问题:
1、在程序编译完成后执行程序,会存在报错“Excel服务器出现异常”,具体原因暂时还不知道,我使用的Excel是2013版本的;
2、使用此种方式会在Excel07中出现截取不到图片的情况,2013版本的正常。原因是在剪贴板中取不到数据。
备注:
1、项目完整代码会整理完成后添加链接,链接地址会在本次Demo完结章节中给出。
2、本人所有文章皆为本人个人工作中遇到的问题进行汇总的学习笔记,如存在侵权行为,请及时联系删除。
1.《【vc怎么显示excel】Vc操作excel实现指定区域拦截jpg图片生成7-使用剪贴板实现》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【vc怎么显示excel】Vc操作excel实现指定区域拦截jpg图片生成7-使用剪贴板实现》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/2516562.html