我有一个Excel电子表格,它是一张带有表格和图表的表格。我需要做的是将其添加到PDF。我正在使用的PDF API不支持导入Excel文档,因此我想知道C ++中是否有任何方法可以将Excel文档保存/转换为Jpeg(或BMP)?
只是要添加,显然这必须在C ++中完成,作为现有应用程序的一部分,每次运行时都会创建PDF。我不会问这个问题是否可以手动完成。
答案 0 :(得分:2)
我经过多次努力和拔毛后,设法回答了我自己的问题。与其他答案中所说的相反,可以将Excel电子表格保存为Jpeg(虽然我已经坚持使用位图格式,因为这对我来说已经足够了。但是转换为jpeg很容易)。我通过Excel API做的是选择使用的范围。从那里,我将其作为图片复制到剪贴板,然后获取剪贴板数据并将其转换为具有IPicture界面的图片对象。从那里,创建一个流并将其复制到流中,然后将此流保存到文件。结果是一个bmp文件,其中包含我所追求的图像。代码示例如下。
CRange range = sheet.get_UsedRange();
range.CopyPicture(Excel::xlScreen, Excel::xlBitmap);
if (IsClipboardFormatAvailable(CF_BITMAP)) // just to be sure it copied
{
if (OpenClipboard(NULL) > 0)
{
// save clipboard as bmp
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
SaveBitmap(ps_filename, hBitmap, NULL);
CloseClipboard();
}
}
}
bool CExcelDocument::SaveBitmap(LPCSTR filename, HBITMAP bmp, HPALETTE pal)
{
bool bReturn = false;
PICTDESC pictdesc;
LPPICTURE pPicture;
::ZeroMemory( &pictdesc, sizeof(pictdesc) );
pictdesc.picType = PICTYPE_BITMAP;
pictdesc.bmp.hbitmap = bmp;
pictdesc.bmp.hpal = pal;
pictdesc.cbSizeofstruct = sizeof(PICTDESC);
HRESULT hr = OleCreatePictureIndirect(&pictdesc, IID_IPicture, false, reinterpret_cast<void**>(&pPicture));
if (!SUCCEEDED(hr))
return false;
LPSTREAM pStream;
hr = CreateStreamOnHGlobal(0, true, &pStream);
if (!SUCCEEDED(hr))
{
pPicture->Release();
return false;
}
LONG lBytesRead = 0;
DWORD lBytesWritten = 0;
hr = pPicture->SaveAsFile(pStream, true, &lBytesRead);
if (!SUCCEEDED(hr))
{
pStream->Release();
pPicture->Release();
return false;
}
HANDLE hFile = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (!hFile)
{
return false;
}
HGLOBAL hMemory = 0;
GetHGlobalFromStream(pStream, &hMemory);
LPVOID pData = GlobalLock(hMemory);
bReturn = !!WriteFile(hFile, pData, lBytesRead, &lBytesWritten, 0);
bReturn &= (lBytesWritten == static_cast<DWORD>(lBytesRead));
GlobalUnlock(hMemory);
CloseHandle(hFile);
pStream->Release();
pPicture->Release();
return bReturn;
}
答案 1 :(得分:-1)
您可以使用Execl API(Office Interop)将电子表格加载到C ++中。现在,您可以访问行和列中的值。您还应该能够提取它们的大小(宽度和高度)。这是你的出发点。
现在最简单的方法是使用GDI(或其他)创建新图片并浏览Excel工作表中的每个单元格,并将其内容绘制到图片中。在此之后,您可以绘制类似于细胞本身的线条。
无论如何,这会带来很多工作并且不容易,特别是如果你必须考虑单元格内的文本对齐和边框大小等等。