在jeecgboot中制作查询报表非常方便,可以在online报表配置中快速完成。
在数据库中可以看到对应的两张表存放这些配置,一张是onl_cgreport_head,存放查询表的头部信息。
另一张是明细表onl_cgreport_item,存放查询报表的字段信息。
在开发数据大屏时需要很多查询数据,可以先在online报表中配置查询SQL,通过报表查看需要的数据,然后用VBA通过数据库中的这两张表可以生成jeecgboot后端接口代码。
首先在MySQL 官网上下载 Excel 连接 MySQL 数据库的工具,连接为:
https://dev.mysql.com/downloads/windows/excel/
连接mysql的方法
Public Sub OpenConnection(Server As String, PORT As Long, DB As String, UID As String, PWD As String) Set conn = New ADODB.Connection conn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server _ & ";Port=" & PORT & ";DB=" & DB & ";UID=" & UID & ";PWD=" & PWD & ";OPTION=3;" conn.Open End Sub
查询SQL数据并显示到listview的方法
Public Sub dataToListView(sql As String, lv As ListView) lv.ListItems.Clear lv.ColumnHeaders.Clear Dim i, j Dim rc As New ADODB.Recordset rc.Open sql, conn, adOpenStatic For i = 0 To rc.Fields.Count - 1 lv.ColumnHeaders.Add , , rc.Fields(i).Name Next i rc.MoveFirst i = 1 Do Until rc.EOF lv.ListItems.Add , , rc.Fields(0) For j = 1 To rc.Fields.Count - 1 If Not IsNull(rc.Fields(j)) Then lv.ListItems(i).SubItems(j) = rc.Fields(j) Next j i = i + 1 rc.MoveNext Loop rc.Close Set rc = Nothing End Sub
将上面方法放到类模块中,就可以实例化对象来使用方法。
如连接数据库,将编码以"sql_"开头的的SQL报表显示到listview1中
msql.OpenMySQLConnection IP, PORT, DATABASE, USERNAME, PASSWORD msql.dataToListView "select * from onl_cgreport_head where left(code,4)=""sql_""", ListView1
选择SQL报表,显示明细到listview2中。
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) msql.dataToListView "select * from onl_cgreport_item where cgrhead_id=""" & Item.Text & """", ListView2 End Sub
一键生成文件夹、java和xml文件
If ListView1.SelectedItem Is Nothing Then Else folderPath = ThisWorkbook.Path & "\api" entity = Replace(ListView1.SelectedItem.SubItems(1), "sql_", "") desc = ListView1.SelectedItem.SubItems(2) cf.MakeFolder folderPath cf.MakeFolder folderPath & "\" & entity cf.MakeFolder folderPath & "\" & entity & "\controller" createController cf.MakeFolder folderPath & "\" & entity & "\entity" createEntity cf.MakeFolder folderPath & "\" & entity & "\mapper" cf.MakeFolder folderPath & "\" & entity & "\mapper\xml" createXML createMapper cf.MakeFolder folderPath & "\" & entity & "\service" createService cf.MakeFolder folderPath & "\" & entity & "\service\impl" createImpl End If
其中生成实体类的代码
Dim cf As New CFileAction With cf .Clear .WriteText "package org.jeecg.modules.demo.api." & entity & ".entity;" & vbCrLf .WriteText "import lombok.Data;" & vbCrLf .WriteText "@Data" & vbCrLf .WriteText "public class " & entity & " {" & vbCrLf For i = 1 To ListView2.ListItems.Count .WriteText " private " & ListView2.ListItems(i).SubItems(5) & " " & ListView2.ListItems(i).SubItems(2) & ";" & vbCrLf Next i .WriteText "}" & vbCrLf WriteUTF8File .txt, folderPath & "\" & entity & "\entity\" & entity & ".java" End With Set cf = Nothing
生成java代码时需要的是没有BOM的UTF-8编码,一开始使用ADODB.Stream对象来保存java文件,IDEA打开后每个文件都要切换GBK再换回UTF-8编码才能正常使用。后来用以下api函数来保存java文件,默认bBOM为false,生成的代码可以直接运行使用。
Public Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByRef lpMultiByteStr As Any, _ ByVal cchMultiByte As Long, _ ByVal lpWideCharStr As Long, _ ByVal cchWideChar As Long) As Long Public Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As LongPtr, _ ByVal cchWideChar As Long, _ ByRef lpMultiByteStr As Any, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As String, _ ByVal lpUsedDefaultChar As Long) As Long Public Const CP_UTF8 = 65001 ' 将输入文本写进UTF8格式的文本文件 ' 输入 ' strInput:文本字符串 ' strFile:保存的UTF8格式文件路径 ' bBOM:True表示文件带"EFBBBF"头,False表示不 Public Sub WriteUTF8File(strInput As String, strFile As String, Optional bBOM As Boolean = False) Dim bByte As Byte Dim ReturnByte() As Byte Dim lngBufferSize As Long Dim lngResult As Long Dim TLen As Long ' 判断输入字符串是否为空 If Len(strInput) = 0 Then Exit Sub 'On Error GoTo errHandle ' 判断文件是否存在,如存在则删除 If Dir(strFile) <> "" Then Kill strFile TLen = Len(strInput) lngBufferSize = TLen * 3 + 1 ReDim ReturnByte(lngBufferSize - 1) lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(strInput), TLen, ReturnByte(0), lngBufferSize, vbNullString, 0) If lngResult Then lngResult = lngResult - 1 ReDim Preserve ReturnByte(lngResult) Open strFile For Binary As #1 If bBOM = True Then bByte = 239 Put #1, , bByte bByte = 187 Put #1, , bByte bByte = 191 Put #1, , bByte End If Put #1, , ReturnByte Close #1 End If End Sub
api接口测试成功。