1

現在、Excel ソリューションを Web ソリューションにアップスケーリングしています。このプロセスでは、既存のデータを新しい (SQL Server) データベースにアップロードする必要があります。

問題は、Excel ファイルに (形状として) 保存されている画像もアップロードする必要があることです。データベースでは、バイト配列として PNG 形式で保存されます。

埋め込まれた画像のソースを取得する最良の方法は何ですか?

私は現在ws.Shapes("img_1").CopyPicture、いくつかの API 関数を使用してそれを取得することを考えていますが、これまでのところ、適切な API 関数を理解するのに行き詰まりました。また、より簡単でエレガントな方法がないかどうかはわかりません...

4

2 に答える 2

0

すべての画像をディスク内のファイルとして取得し、後でそれらをデータベースにアップロードすることを気にしない場合は、Excel ワークブックまたはワークシートを "Web ページ" として保存できます。

これにより、html ファイルと、元の Excel ファイルにある画像 (画像ごとに 1 つの PNG ファイル) で満たされたディレクトリが作成されます。

于 2013-07-11T12:24:59.080 に答える
0

さて、最終的に解決策を見つけました。これが最も洗練されたバージョンかどうかはわかりませんが、現時点では IrfanView または別のコンバーターが必要ですが、問題なく動作します。で呼び出すことができfctStrConvertImageToString(Sheets("YourSheet").Shapes("YorImage"))、この画像の PBG を文字列として返します。

Option Explicit

Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(8) As Byte
End Type

Private Type PICTDESC
    cbSize As Long
    picType As Long
    hImage As Long
End Type

Private Declare Function OpenClipboard& Lib "user32" (ByVal hwnd&)
Private Declare Function EmptyClipboard& Lib "user32" ()
Private Declare Function GetClipboardData& Lib "user32" (ByVal wFormat%)
Private Declare Function SetClipboardData& Lib "user32" (ByVal wFormat&, ByVal hMem&)
Private Declare Function CloseClipboard& Lib "user32" ()
Private Declare Function CopyImage& Lib "user32" (ByVal handle&, ByVal un1&, ByVal n1&, ByVal n2&, ByVal un2&)
Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As String, ByRef lpiid As GUID) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32" (pPictDesc As PICTDESC, ByRef riid As GUID, ByVal fOwn As Long, ByRef ppvObj As IPicture) As Long

Public Function fctStrConvertImageToString(shp As Shape) As String
    Const cStrPath As String = "C:\Temp\"
    Const cStrFileName As String = "temp"
    Const cStrSourceExtension As String = "bmp"
    Const cStrTargetExtension As String = "png"

    Dim strSource As String, strTarget As String


    If shp.Type <> msoPicture Then Exit Function

    shp.CopyPicture 1, xlBitmap

    strSource = cStrPath & cStrFileName & "." & cStrSourceExtension
    strTarget = cStrPath & cStrFileName & "." & cStrTargetExtension

    subSavePicAsBitmap strSource

    subConvertFile strSource, strTarget

    fctStrConvertImageToString = fctStrReadFile(strTarget)

    Kill strSource
    Kill strTarget
End Function

Private Sub subSavePicAsBitmap(strFile As String)
    Const cStrPictureIID = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"

    Dim hCopy&: OpenClipboard 0&
    Dim iPic As IPicture
    Dim tIID As GUID
    Dim tPICTDEST As PICTDESC
    Dim lngReturn As Long

    hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
    CloseClipboard
    If hCopy = 0 Then Exit Sub

    lngReturn = IIDFromString(StrConv(cStrPictureIID, vbUnicode), tIID)
    If lngReturn Then Exit Sub

    With tPICTDEST
        .cbSize = Len(tPICTDEST)
        .picType = 1
        .hImage = hCopy
    End With
    lngReturn = OleCreatePictureIndirect(tPICTDEST, tIID, 1, iPic)

    SavePicture iPic, strFile
End Sub

Private Sub subConvertFile(strSource As String, strTarget As String)
    Const cStrConverter = """c:\Program Files (x86)\IrfanView\i_view32.exe"""
    Shell cStrConverter & " " & strSource & " /convert=" & strTarget, 0
End Sub

Private Function fctStrReadFile(strFile As String)
    Dim hFile As Long

    hFile = FreeFile
    Open strFile For Binary Access Read As #hFile
    fctStrReadFile = Input$(LOF(hFile), hFile)
    Close #hFile

End Function
于 2013-07-11T12:34:00.923 に答える