EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账

news2024/11/17 19:44:02

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账

实现效果如上
代码如下


使用须知:
1、工具--引用里勾选[Adobe Acrobat 10.0 Type Library]
2、安装Adobe Acrobat pro软件

Dim sht As Worksheet
Function BrowseFolders() As String  '浏览目录
    Dim objshell As Object
    Dim objFolder As Object
    Set objshell = CreateObject("Shell.Application")
    Set objFolder = objshell.BrowseForFolder(0, "请指定发票文件所在的文件夹", 0, 0)
    BrowseFolders = ""
    If Not objFolder Is Nothing Then
        BrowseFolders = objFolder.Self.Path
    End If
    Set objFolder = Nothing
    Set objshell = Nothing
End Function

Sub cmd_getpdf_Click()
    Dim Pth As String '文件路径
    Dim PDFName As String, Wapp As Object, Mstr As String
    Application.ScreenUpdating = False
    '============================================
    Pth = BrowseFolders
    If Pth = "" Then
        Pth = Sheet1.Range("A9").Text
    End If
    If Pth = "" Then
        Pth = ThisWorkbook.Path
    End If
    If Right(Pth, 1) <> "\" Then Pth = Pth & "\"
    Sheet1.Range("A8") = "上次路径:"
    Sheet1.Range("A9") = Pth
    Sheet1.Range("a15:a10000") = ""
    If Dir(Pth & "*.pdf") = "" Then
        MsgBox "指定目录没有找到发票PDF文件!"
        Sheet1.Range("A9") = ""
        Exit Sub
    End If
    'Debug.Print Pth
    '============================================
    For Each sht In ThisWorkbook.Sheets
        Application.DisplayAlerts = False
        If sht.Name = "发票资料读取到Excel" Then sht.Delete
        Application.DisplayAlerts = True
    Next
    Set sht = Worksheets.Add(, Worksheets(Sheets.Count))
    sht.Name = "发票资料读取到Excel"
    sht.Range("A1:J1") = Array("发票号码", "发票日期", "货物或*名称", "规格型号", "单位", "数量", "单价", "金额", "税率", "税额")
    '============================================定义表头字段
    PDFName = Dir(Pth & "*.pdf")
    Do While PDFName <> ""
          Call Imp_Into_XL(Pth & PDFName)
          PDFName = Dir
    Loop
    sht.Columns.AutoFit
    MsgBox "操作完成!"
    '============================================
    Application.ScreenUpdating = True
End Sub

Sub Imp_Into_XL(PDF_File As String)
    Dim AC_PD As Acrobat.AcroPDDoc
    Dim AC_Hi As Acrobat.AcroHiliteList
    Dim AC_PG As Acrobat.AcroPDPage
    Dim AC_PGTxt As Acrobat.AcroPDTextSelect
    Dim Yes_Fir As Boolean
    Dim Ct_Page As Long
    Dim i As Long, j As Long, k As Long, m As Integer
    Dim T_Str As String
    Dim Hld, XL, Brr(), RowNo%, Arr As Variant, sss%
    Dim Hld_Txt As Variant
    Dim FPHM As String   '发票号码
    Dim FPRQ As String   '发票日期
    Dim GGXH As String   '规格型号
    Dim HWMC As String   '货物名称
    Dim SL_SV As String  '数量-税率
    Dim SL_SV_Temp As String  '数量-税率的临时存变量
    Dim HWDW As String   '货物单位
    Dim SL As String     '数量
    Dim DW As String     '单位
    Dim XH As String     '型号
    '====================================================定义字段类型
    Set AC_PD = New Acrobat.AcroPDDoc
    Set AC_Hi = New Acrobat.AcroHiliteList
    AC_Hi.Add 0, 32767
    With AC_PD
        .Open PDF_File
        Ct_Page = .GetNumPages
        If Ct_Page = -1 Then
            MsgBox "请确认发票文件 '" & PDF_File & "'"
            .Close
            GoTo h_end
        End If
        For i = 1 To 1 ' Ct_Page    '只考虑一个文档有一张发票的情形
            T_Str = ""
            Set AC_PG = .AcquirePage(i - 1)
            Set AC_PGTxt = AC_PG.CreateWordHilite(AC_Hi)
            If Not AC_PGTxt Is Nothing Then
                With AC_PGTxt
                    For j = 0 To .GetNumText - 1
                        T_Str = T_Str & .GetText(j)
                    Next j
                End With
            End If
            '==========================================================
            If T_Str <> "" Then
                    Hld_Txt = Split(T_Str, vbCrLf)
                    FPHM = "": FPRQ = "":: GGXH = "": HWMC = ""
                    For j = 0 To UBound(Hld_Txt)
                          If InStr(Hld_Txt(j), "年月日") = 0 Then
                          If InStr(Hld_Txt(j), "年") > 0 And InStr(Hld_Txt(j), "月") > 0 And InStr(Hld_Txt(j), "日") > 0 Then   '当字符串里含有年月日时
                             Hld_Txt(j) = Repce2(Hld_Txt(j))
                             Hld_Txt(j) = Trim(Replace(Hld_Txt(j), "开票日期:", ""))            '如果有"开票日期:"几个字,将其替换掉
                             FPRQ = Left(Hld_Txt(j), 4) & "-" & Mid(Hld_Txt(j), 6, 2) & "-" & Mid(Hld_Txt(j), 9, 2)
                             Exit For
                          End If
                          End If
                    Next j
                    For j = 0 To UBound(Hld_Txt)
                      If TestNumber(Hld_Txt(j)) Then   '测试是否含有数字并以数字结尾的类型,加以判断
                        If Len(Hld_Txt(j)) = 10 And TestCH(Hld_Txt(j)) = False Then '当字符串里没有年月日,但是以"2023 06 30"有空格,共有10个字符串位置形式存在时取得发票日期
                          If InStr(Hld_Txt(j), " ") > 0 And UBound(Split(Hld_Txt(j), " ")) > 0 Then
                             FPRQ = "'" & RegR(Hld_Txt(j))    '取得发票日期
                             Exit For
                          End If
                        End If
                      End If
                    Next j
                    For j = 0 To UBound(Hld_Txt)
                       If TestNumber(Hld_Txt(j)) Then   '测试是否含有数字并以数字结尾的类型,加以判断
                        Hld_Txt(j) = Trim(Replace(Hld_Txt(j), "发票号码:", ""))            '如果有"发票号码:"几个字,将其替换掉
                        If Len(Hld_Txt(j)) = 8 Or Len(Hld_Txt(j)) = 20 Then          '//***限定要取出的发票号码为8位或者20位数字,否则发票号码取不出来
                          If IsNumeric(Hld_Txt(j)) Then
                             If InStr(Hld_Txt(j), ".") = 0 And InStr(Hld_Txt(j), ChrW(165)) = 0 Then
                               FPHM = Regs(Hld_Txt(j)) '取得8位或者20位的发票号码
                               Exit For
                             End If
                          End If
                        End If
                       End If
                   Next j
                   k = 0
                   For j = 0 To UBound(Hld_Txt)
                        If Len(Trim(Hld_Txt(j))) > 2 Then        '//***当字符数大于2,有的只有一个*,这种情形需要排除
                        If Left(Trim(Hld_Txt(j)), 1) = "*" Or InStr(Hld_Txt(j), "详见") > 0 Then  '////当货物名称前面第一个字符是*号或者含有(详见)时
                        Arr = Array("+", "<", ">")   '/***密码区有许多有这几个符号,遇到了就避开它
                        sss = 0
                        For m = LBound(Arr) To UBound(Arr)               '//***避免遇到密码区以*号开头,并且有Arr数组里符号的情形
                          If InStr(Hld_Txt(j), Arr(m)) > 0 Then sss = sss + 1
                        Next m
                        If sss = 0 Then
                           Hld_Txt(j) = Trim(Hld_Txt(j))                '清除前后空格
                           Hld_Txt(j) = StrConv(Hld_Txt(j), vbNarrow)   '全角转为半角
                           Hld_Txt(j) = Repce(Hld_Txt(j))               '将字符串中多个空格变成一个
                           If InStr(Hld_Txt(j), "%") > 0 Or Right(Trim(Hld_Txt(j)), 1) = "*" Then
                              For m = UBound(Split(Hld_Txt(j), " ")) To 0 Step -1
                                  If TestCHNum(Split(Hld_Txt(j), " ")(m)) = False Or Trim(Split(Hld_Txt(j), " ")(m)) = "*" Then   '循环判定,取出有数字的数量-税额部分//有部分的金额和税额是*号
                                     If TestCH(Split(Hld_Txt(j), " ")(m)) = True And InStr(Hld_Txt(j), "不征税") = 0 Then Exit For
                                     SL_SV = Split(Hld_Txt(j), " ")(m) & " " & SL_SV
                                     SL_SV_Temp = Split(Hld_Txt(j), " ")(m) & " " & SL_SV_Temp       '增加这个变量,存下原始的数量金额部分
                                     If InStr(SL_SV, "不征税") > 0 And Len(SL_SV) > 3 Then SL_SV = Left(SL_SV, InStr(SL_SV, "税")) & " " & Right(SL_SV, Len(SL_SV) - InStr(SL_SV, "税"))
                                     SL_SV = Trim(SL_SV)
                                     SL_SV_Temp = Trim(SL_SV_Temp)
                                     If m < UBound(Split(Hld_Txt(j), " ")) And Split(Hld_Txt(j), " ")(m) < 0 Then Exit For
                                  ElseIf TestCHNum(Split(Hld_Txt(j), " ")(m)) = True Then    '循环判定,如含有中文+数字,则需拆分
                                     SL_SV = RegSL(Split(Hld_Txt(j), " ")(m)) & " " & SL_SV
                                     SL_SV_Temp = RegSL(Split(Hld_Txt(j), " ")(m)) & " " & SL_SV_Temp
                                     SL_SV = Trim(SL_SV)
                                     SL_SV_Temp = Trim(SL_SV_Temp)
                                     Exit For
                                  End If
                              Next m
                              SL_SV = Repce(SL_SV): SL_SV_Temp = Repce(SL_SV_Temp)  '用原始的数量金额部分来方便取出GGXH
                              GGXH = Trim(Replace(Hld_Txt(j), SL_SV_Temp, ""))  '去掉数量-税额部分,下余的是规格型号   ////***前面做过变动后,这里用replace取不出余下的规格型号
                              SL_SV_Temp = ""
                              SL_SV = SL_JE(SL_SV)                         '数量-税额部分,不能用trim去掉前面空格
                              If InStr(GGXH, "费") > 0 Then
                                 HWMC = Left(GGXH, InStr(GGXH, "费"))         '货物名称,有费字的取费字前面字符(含费字)作为货物名称
                                 GGXH = Trim(Replace(GGXH, HWMC, ""))         '费字后面的是规格型号+单位
                              Else
                                 If InStr(GGXH, " ") = 0 Then
                                    HWMC = GGXH: GGXH = ""                   '规格型号没有包含空格时,货物名称就取ggxh,将原来的ggxh置空
                                 Else
                                    HWMC = Split(GGXH, " ")(0)               '规格型号有包含空格时,货物名称取ggxh的第一个空格前的字符
                                    GGXH = Trim(Replace(GGXH, HWMC, ""))     '规格型号取除了货物名称后的余下的值
                                 End If
                              End If
                              If InStr(GGXH, " ") = 0 Then          '当规格型号没有空格时********
                                 Select Case Len(GGXH)
                                     Case Is = 0                    '当费后面的字符数量为0时
                                        If Split(SL_SV, " ")(0) = "" Then     '当数据部分第一个字符为空时,货物名称就只为货物名称
                                           HWMC = HWMC & " " & " "
                                        Else                                '当数据部分第一个字符不为空时,货物名称取最后一个值为单位,次一个值为规格型号
                                           If Mid(HWMC, Len(HWMC) - 1, 2) = "服务" Or InStr(HWMC, "费") > 0 Then
                                              HWMC = HWMC & " " & " "                '当货物名称最后两个字是"服务"时或含有"费",已经不能拆开了.
                                           ElseIf InStr(HWMC, "费") = 0 Then
                                              DW = Right(HWMC, 1)                      '取右边一位做单位*****
                                              XH = Mid(HWMC, Len(HWMC) - 1, 1)
                                              HWMC = Left(HWMC, Len(HWMC) - 2)
                                              If InStr(HWMC, XH & DW) > 0 Or InStr(HWMC, XH) > 0 Or InStr(HWMC, DW) > 0 Then
                                                 HWMC = HWMC & XH & DW & " " & " "
                                              Else
                                                 HWMC = HWMC & " " & XH & " " & DW
                                              End If
                                           End If
                                        End If
                                     Case Is >= 1                   '当费后面的字符数量为1或者大于1时
                                        DW = Right(GGXH, 1)                         '取右边一位做单位
                                        XH = Replace(GGXH, DW, "")               '余下的是型号
                                        If Split(SL_SV, " ")(0) = "" Then
                                           HWMC = HWMC & " " & " "
                                        Else
                                           If XH <> "" Then
                                              HWMC = HWMC & " " & XH & " " & DW
                                           Else
                                              HWMC = HWMC & " " & " " & DW
                                           End If
                                        End If
                                 End Select
                              ElseIf InStr(GGXH, " ") > 0 Then       '当规格型号有空格时
                                 If Split(SL_SV, " ")(0) <> "" Then
                                    HWDW = Split(GGXH, " ")(UBound(Split(GGXH, " ")))     '单位
                                    If Len(HWDW) > 1 Then
                                       HWDW = Right(HWDW, 1)
                                       GGXH = Replace(GGXH, HWDW, "")
                                       GGXH = Replace(GGXH, " ", "_")
                                       HWMC = HWMC & " " & GGXH & " " & HWDW
                                    Else
                                       XH = Trim(Replace(GGXH, HWDW, ""))             '规格型号
                                       If XH = "" Then
                                          If Len(HWDW) > 1 Then
                                             DW = Right(HWDW, 1)
                                             XH = Replace(HWDW, DW, "")
                                             HWMC = HWMC & " " & XH & " " & DW
                                          ElseIf Len(HWDW) = 1 Then
                                             HWMC = HWMC & " " & " " & DW
                                          End If
                                       Else
                                          DW = HWDW
                                          XH = Trim(Replace(XH, " ", "_"))                 '去掉规格型号中的空格,用下横线连接
                                          HWMC = HWMC & " " & XH & " " & DW
                                       End If
                                     End If
                                 ElseIf Split(SL_SV, " ")(0) = "" Then
                                     XH = Replace(GGXH, " ", "_")                 '去掉规格型号中的空格,用下横线连接
                                     HWMC = HWMC & " " & XH & " "                 '没有单位,要加上表示单位的空格
                                 End If
                              End If
                           ElseIf UBound(Split(Hld_Txt(j), " ")) <= 2 And InStr(Hld_Txt(j), "%") = 0 Then           '当品名与数量金额等不在同一行时
                              HWMC = Hld_Txt(j)
                              For m = j To UBound(Hld_Txt)
                                  If InStr(Hld_Txt(m), "%") > 0 Then SL_SV_Temp = Hld_Txt(m): Exit For
                              Next m
                              For m = UBound(Split(SL_SV_Temp, " ")) To 0 Step -1
                                  If TestCHNum(Split(SL_SV_Temp, " ")(m)) = False Or Trim(Split(SL_SV_Temp, " ")(m)) = "*" Then   '循环判定,取出有数字的数量-税额部分//有部分的金额和税额是*号
                                     If TestCH(Split(SL_SV_Temp, " ")(m)) = True And InStr(SL_SV_Temp, "不征税") = 0 Then Exit For
                                     SL_SV = Split(SL_SV_Temp, " ")(m) & " " & SL_SV       '增加这个变量,存下原始的数量金额部分
                                     If InStr(SL_SV, "不征税") > 0 And Len(SL_SV) > 3 Then SL_SV = Left(SL_SV, InStr(SL_SV, "税")) & " " & Right(SL_SV, Len(SL_SV) - InStr(SL_SV, "税"))
                                     SL_SV = Trim(SL_SV)
                                     If m < UBound(Split(SL_SV_Temp, " ")) And Split(SL_SV_Temp, " ")(m) < 0 Then Exit For
                                  ElseIf TestCHNum(Split(SL_SV_Temp, " ")(m)) = True Then    '循环判定,如含有中文+数字,则需拆分
                                     SL_SV = RegSL(Split(SL_SV_Temp, " ")(m)) & " " & SL_SV
                                     SL_SV = Trim(SL_SV)
                                     Exit For
                                  End If
                              Next m
                              SL_SV_Temp = Replace(SL_SV_Temp, SL_SV, "")
                              SL_SV = Repce(SL_SV) '用原始的数量金额部分来方便留下GGXH
                              GGXH = Trim(Replace(SL_SV_Temp, SL_SV, ""))  '去掉数量-税额部分,下余的是规格型号   ////***前面做过变动后,这里用replace取不出余下的规格型号
                              If Len(GGXH) = 0 Then         '当规格型号为空时
                                 DW = Split(HWMC, " ")(UBound(Split(HWMC, " ")))
                                 HWMC = Trim(Replace(HWMC, DW, ""))
                                 XH = Trim(Replace(HWMC, Split(HWMC, " ")(0), " "))
                                 HWMC = Trim(Replace(HWMC, XH, ""))
                                 If InStr(HWMC, " ") > 0 Then HWMC = Replace(HWMC, " ", "_")    '将货物名称里原有的空格用下划线代替
                                 If InStr(XH, " ") > 0 Then XH = Replace(XH, " ", "_")          '将型号里原有的空格用下划线代替
                                 If Len(XH) > 0 Then
                                    HWMC = HWMC & " " & XH & " " & DW
                                 Else
                                    HWMC = HWMC & " " & " " & DW
                                 End If
                              ElseIf Len(GGXH) > 0 Then                        '当规格型号不为空时
                                 If InStr(HWMC, " ") > 0 Then HWMC = Replace(HWMC, " ", "_")    '将货物名称里原有的空格用下划线代替
                                 If InStr(GGXH, " ") > 0 Then
                                    DW = Split(GGXH, " ")(UBound(Split(GGXH, " ")))   '单位
                                    XH = Trim(Replace(SL_SV_Temp, DW, ""))                     '型号
                                    If InStr(XH, " ") > 0 Then XH = Replace(XH, " ", "_")          '将型号里原有的空格用下划线代替
                                    If Len(XH) > 0 Then
                                       HWMC = HWMC & " " & XH & " " & DW
                                    Else
                                       HWMC = HWMC & " " & " " & DW
                                    End If
                                 Else
                                    DW = Right(GGXH, 1)                      '取右边一位做单位*****
                                    XH = Replace(GGXH, DW, "")
                                    HWMC = HWMC & " " & XH & " " & DW
                                 End If
                              End If
                           End If
                           If Split(SL_SV, " ")(0) = "" Then     '///*****************
                              Hld_Txt(j) = HWMC & SL_SV
                           Else
                              Hld_Txt(j) = HWMC & " " & SL_SV
                           End If
                           HWMC = "": SL_SV = "":   SL = "": DW = "": XH = "": GGXH = "": HWDW = "": SL_SV_Temp = ""
                           If UBound(Split(Hld_Txt(j), " ")) = 7 Then
                              k = k + 1
                              ReDim Preserve Brr(1 To 10, 1 To k)
                              Brr(1, k) = "'" & FPHM: Brr(2, k) = FPRQ       '编号及日期
                              For m = 0 To UBound(Split(Hld_Txt(j), " "))
                                  Brr(3 + m, k) = Split(Hld_Txt(j), " ")(m)
                              Next m
                           Else
                              GoTo 0
                           End If
                        End If
                        End If
                        End If
                   Next j
                   With sht
                     If k = 0 Then GoTo 0
                     RowNo = .Cells(65536, 1).End(3).Row + 1
                     .Cells(RowNo, 1).Resize(UBound(Brr, 2), UBound(Brr)) = Application.Transpose(Brr)
                  '  .Cells(RowNo, 11) = PDF_File              '将文件名称放在最后一列
                     Erase Brr
                   End With
           ElseIf T_Str = "" Then
0
              MsgBox PDF_File & "文件没有取到数据,请检查!", vbOKOnly, "ExcelHome"
              Sheet1.Cells(Sheet1.Cells(65536, 1).End(3).Row + 1, 1) = PDF_File    '将有问题的文件名称放在sheet1表中,方便查验
              Exit For
           End If
            '===========================================================
        Next i
            .Close
    End With

h_end:
    Set AC_PGTxt = Nothing
    Set AC_PG = Nothing
    Set AC_Hi = Nothing
    Set AC_PD = Nothing
End Sub
Function Regs(STR)        '取发票号码
Dim reg As Object, mh As Variant
 Set reg = CreateObject("VBScript.RegExp")
 With reg
   .Global = True
   .Pattern = "(^\d{8}$|^\d{20}$)"    '是8位或者是20位
    Set mh = .Execute(STR)
    Regs = mh.Item(0).SubMatches.Item(0)
 End With
End Function
Function RegR(STR)        '取发票日期
Dim reg As Object, mh As Variant
 Set reg = CreateObject("VBScript.RegExp")
 With reg
   .Global = True
   .Pattern = "(^\d{4} \d{2} \d{2}$)"    '前四位年,中两位月,后两位日
    Set mh = .Execute(STR)
    RegR = Replace(mh.Item(0).SubMatches.Item(0), " ", "-")
 End With
End Function
Function RegSL(STR)        '取数量
Dim reg As Object, mh As Variant
 Set reg = CreateObject("VBScript.RegExp")
 With reg
   .Global = True
   '.Pattern = "[\u4e00-\u9fff](\d+\.\d+|\d+)"    '中文后面跟的数量为小数或整数
   .Pattern = "[\u4e00-\u9fff]([-]?\d+\.\d+$|[-]?\d+$)"    '中文后面跟的数量为小数或整数
    Set mh = .Execute(STR)
    RegSL = mh.Item(0).SubMatches.Item(0)
 End With
End Function
Function TestNumber(STR)        '测试是否最后是数字
Dim reg As Object
 Set reg = CreateObject("VBScript.RegExp")
 With reg
   .Global = True
   .Pattern = "^\d+\.\d+$|\d+$"
    TestNumber = .test(STR)
 End With
End Function
Function TestCH(STR)        '测试是否以中文开始
Dim reg As Object
 Set reg = CreateObject("VBScript.RegExp")
 With reg
   .Global = True
   .Pattern = "[\u4e00-\u9fff]+"
    TestCH = .test(STR)
 End With
End Function
Function TestCHNum(STR)        '测试是否以中文后跟随数字
Dim reg As Object
 Set reg = CreateObject("VBScript.RegExp")
 With reg
   .Global = True
   .Pattern = "[\u4e00-\u9fff]([-]?\d+\.\d+$|[-]?\d+$)"
    TestCHNum = .test(STR)
 End With
End Function
Public Function Repce(STR)        '多个空格变成一个
With CreateObject("VBSCRIPT.REGEXP")
  .Global = True
  .Pattern = "\s+"
  Repce = .Replace(STR, " ")
End With
End Function
Public Function Repce2(STR)        '去掉中间空格
With CreateObject("VBSCRIPT.REGEXP")
  .Global = True
  .Pattern = "\s+"
  Repce2 = .Replace(STR, "")
End With
End Function
Public Function SL_JE(STR)        '处理数量金额这部分
   Dim i%, str_temp
   Select Case UBound(Split(STR, " "))
     Case Is >= 5
       For i = UBound(Split(STR, " ")) To UBound(Split(STR, " ")) - 4 Step -1
           str_temp = Split(STR, " ")(i) & " " & str_temp
       Next i
           SL_JE = Trim(str_temp)
     Case 4
        SL_JE = STR
     Case 2
        SL_JE = "   " & STR
   End Select
End Function

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ORM-08-EclipseLink 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; 1. EclipseLink概述 本章介绍了EclipseLink及其关键特性&#xff1a;包括在EclipseLink中的组件、元数据、应用程序架构、映射和API。 本…

202|读书笔记《金融的本质:伯南克四讲美联储》

今天跟朋友聊天&#x1f4ac;&#xff0c;说已经没人看书了&#x1f4d6; 我想&#xff0c; 还是会有人读书的吧。 ​ 一、美联储的起源和使命 1. 第一讲&#xff1a;美国南北战争结束后的40年间&#xff0c;美国经历了6次大的银行体系恐慌&#xff0c;促使其于1913年成立美联储…

如何在Word中选择多个图片?这里提供两个方法及详细步骤

你的Word文档中可能有一些图片。要更改图片的几个参数,可以逐个编辑它们。当你有更多的图片时,你可能需要一次选择所有图片。这允许你一次更改所有内容。默认情况下,Word不允许你一次选择多张图片。 Word插入图片的两个布局选项 文字环绕 嵌入文本中 默认情况下,Word会在文…

注册表学习——注册表结构

简介&#xff1a;注册表是由很多项和值构成的。 HEKY_USERS&#xff08;HKU&#xff09; 主要保存默认用户及当前登录用户配置信息。 .DEFAULT 该项是针对未来创建的新用户所保存的默认配置项。 S-1-5-18等项 这些项叫作安全标识符&#xff08;SID&#xff09;用来表示Windows操…

初识C语言·自定义类型(2)

目录 1 结构体的声明和定义 2 结构体的自引用 3 结构体成员访问操作符 4 内存对齐 4 结构体传参 5 位段 1 结构体的声明和定义 什么是结构&#xff1f;结构也就是元素的集合&#xff0c;在C语言里面&#xff0c;结构体里面的可以有多个变量&#xff0c;类似于集合中的元素…

下载并安装nacos 2.3 for arm64

客户组织安全测试&#xff0c;我们系统测出了好几个高危问题&#xff0c;其中大部分是关于nacos的。 原先的nacos版本太低了&#xff0c;是1.3的。现在&#xff08;2024.01&#xff09;已经是2.3了&#xff0c;应该装个新的。我们使用docker安装nacos&#xff0c;原本很简单的…

程序员必备的20个学习网站

今天好学编程小编整理了20个程序员必备的学习网站&#xff0c;此篇对于新手程序员比较有用&#xff0c;技术老鸟们也可以查缺补漏。话不多说&#xff0c;纯纯干货呈上&#xff0c;赶紧点个赞收藏&#xff0c;以后会用得上&#xff01; 技术网站类 1、博客园 一个面向开发者的…

基于SSM的蛋糕甜品店管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的蛋糕甜品店管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

【网站项目】基于SSM的251国外摇滚乐队交流和周边售卖系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

opencv012 滤波器04 中值滤波,双边滤波

中值滤波 取中位数&#xff0c;可以处理椒盐噪音 CV自带medianBlur函数dst cv2.medianBlur(src, ksize) 参数说明&#xff1a;1.src: 需要滤波的图片&#xff1b;2.ksize&#xff1a;核大小&#xff0c;必须是比1大的奇数【举个例子&#xff1a;3&#xff0c;5&#xff0c;7……

司铭宇老师:企业销售培训:企业培训销售效果评估与质量提升

企业销售培训&#xff1a;企业培训销售效果评估与质量提升 随着市场竞争的日益激烈&#xff0c;企业越来越重视员工培训&#xff0c;希望通过高质量的培训提高员工的技能和素质&#xff0c;进而提升企业的竞争力和业绩。然而&#xff0c;在实践中&#xff0c;很多企业的培训销售…

Redis——list以及他的应用场景

介绍 &#xff1a;list 即是 链表。链表是一种非常常见的数据结构&#xff0c;特点是易于数据元素的插入和删除并且且可以灵活调整链表长度&#xff0c;但是链表的随机访问困难。许多高级编程语言都内置了链表的实现比如 Java 中的 LinkedList&#xff0c;但是 C 语言并没有实现…

安泰电子ATA-3080功率放大器在雷达系统无线电能传输中的具体应用

雷达技术在现代通信和导航系统中起着至关重要的作用。而功率放大器作为一种关键的电子器件&#xff0c;在雷达无线电能传输中扮演着不可或缺的角色。功率放大器负责将来自雷达发射机的低功率无线电信号放大到足够高的水平&#xff0c;以便能够穿透大气层&#xff0c;传输到远距…

江大白 | 万字长文图解Numpy教程,看这一篇就够了!

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满&#xff0c;有超级详细的图解。 原文链接&#xff1a;万字长文图解Numpy教程&#xff0c;看这一篇就够了&#xff01; (qq.com) 以下文章来源于博客&#xff1a;Medium 作者&…

周鸿祎回应坚定支持华为:因为 360 也被制裁了

在昨天的华为鸿蒙生态千帆启航仪式上&#xff0c;360集团创始人兼CEO周鸿祎发表演讲表示&#xff0c;360坚定地支持华为的决定源于双方都曾遭到制裁。周鸿祎在演讲中提到&#xff1a;“在华为最早被制裁的时候&#xff0c;我们是少数几个公开站出来坚定支持华为的公司。其实也很…

transformer详解

transformer详解 1.从全局角度概括transformer2.位置编码详细解读3.注意力机制4.残差连接5.Batch Normal6.layer normal7.decode 1.从全局角度概括transformer 一个典型的编码器-解码器的结构&#xff0c;类似于sequence-to-sequence 这6&#xff08;可以自己定&#xff09;个…

接口文档swagger2的使用

Spring-接口文档swagger2 1、swagger/knife4j 接口文档配置 ​ knife4j是swagger的增强版本&#xff0c;更加的小巧、轻量&#xff0c;功能也是更加的完善&#xff0c;UI也更加的清晰&#xff1b;可以从swagger到knife4j无缝切换。 1.1 引入相关依赖 <!--接口文档的开发:…

FastDeploy项目简介,使用其进行(图像分类、目标检测、语义分割、文本检测|orc部署)

FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具&#xff0c; 支持云边端部署。提供超过 &#x1f525;160 Text&#xff0c;Vision&#xff0c; Speech和跨模态模型&#x1f4e6;开箱即用的部署体验&#xff0c;并实现&#x1f51a;端到端的推理性能优化。包括 物…

Django从入门到精通(三)

目录 七、ORM操作 7.1、表结构 常见字段 参数 示例 7.2、表关系 一对多 多对多 第一种方式 第二种方式 7.3、连接MYSQL 7.4、数据库连接池 7.5、多数据库 读写分离 分库&#xff08;多个app ->多数据库&#xff09; 分库&#xff08;单app&#xff09; 注意…

坚持刷题 | 平衡二叉树

文章目录 题目考察点代码实现实现总结对实现进一步改进扩展提问 坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天继续二叉树&#xff1a;平衡二叉树 题目 110.平衡二叉树 考察点 递归能力&#xff1a; 能否使用递归来解决问题。树的基本操作&#xff1a;能否正确地访…