序列化和反序列化是 Java 中用于将对象转换为字节流(序列化)或从字节流中恢复对象(反序列化)的技术。在实际应用中,序列化可以用于对象的持久化存储,网络通信,以及进程间通信等场景。

序列化可以将一个对象转换为一系列字节,这些字节包含了对象的数据和类信息。而在反序列化时,可以通过读取这些字节并重新构造出原来的对象。Java 提供了两种序列化方式,一种是基于 ObjectOutputStreamObjectInputStream 的默认 Java 序列化方式,另一种是基于第三方库的 JSON 或 XML 序列化方式。

要进行序列化,需要让类实现 Serializable 接口,并且定义一个 serialVersionUID 静态变量用于标识序列化版本。同时,需要注意的是某些类型的字段是不可序列化的,例如 transient 修饰的字段、static 字段等。

在实际应用中,需要注意序列化和反序列化带来的性能开销和安全问题。因为使用默认序列化方式的对象会被序列化为二进制流,可能存在被篡改、重放攻击的风险,因此需要采取相应的防护措施。同时,由于默认序列化方式的性能较差,也可以选择使用其他序列化方式如 protobufKryo 等。

将当前邮件合并文件拆分为单独的word和pdf,文件名称以数据源中的“姓名”字段重命名。

Sub MailMergeToPdfBasic()
Dim masterDoc As Document
Dim singleDoc As Document
Dim lastRecordNum As Long
Dim saveDir As String
Dim saveName As String

' 保存路径
saveDir = "C:\Users\JIAHE\Desktop\Output\"

Set masterDoc = ActiveDocument
masterDoc.MailMerge.DataSource.ActiveRecord = wdLastRecord
lastRecordNum = masterDoc.MailMerge.DataSource.ActiveRecord
masterDoc.MailMerge.DataSource.ActiveRecord = wdFirstRecord
Do While lastRecordNum > 0
masterDoc.MailMerge.Destination = wdSendToNewDocument
masterDoc.MailMerge.DataSource.FirstRecord = masterDoc.MailMerge.DataSource.ActiveRecord
masterDoc.MailMerge.DataSource.LastRecord = masterDoc.MailMerge.DataSource.ActiveRecord
masterDoc.MailMerge.Execute False
' 文件名称
saveName = masterDoc.MailMerge.DataSource.DataFields("姓名")
Set singleDoc = ActiveDocument
singleDoc.SaveAs2 _
FileName:=saveDir & saveName & ".docx", _
FileFormat:=wdFormatXMLDocument
singleDoc.ExportAsFixedFormat _
OutputFileName:=saveDir & saveName & ".pdf", _
ExportFormat:=wdExportFormatPDF
singleDoc.Close False
If masterDoc.MailMerge.DataSource.ActiveRecord >= lastRecordNum Then
lastRecordNum = 0
Else
masterDoc.MailMerge.DataSource.ActiveRecord = wdNextRecord
End If
Loop
End Sub

参考

Sub ConvertWordToPDF()
Dim folderPath As String
Dim wordFile As String
Dim pdfFile As String
Dim wordApp As Object

'设置要转换的文件夹路径
folderPath = "C:\Users\JIAHE\Desktop\Output\"

'创建Word应用程序对象
Set wordApp = CreateObject("Word.Application")

'关闭屏幕更新,加快转换速度
wordApp.ScreenUpdating = False

'循环遍历目录下的所有Word文件
wordFile = Dir(folderPath & "*.doc*")
Do While wordFile <> ""
'构造PDF文件名
pdfFile = Left(wordFile, Len(wordFile) - 4) & ".pdf"

'打开Word文件
wordApp.Documents.Open folderPath & wordFile

'将Word文件保存为PDF文件
wordApp.ActiveDocument.ExportAsFixedFormat OutputFileName:= _
folderPath & pdfFile, ExportFormat:=17, OpenAfterExport:=False

'关闭Word文档
wordApp.ActiveDocument.Close

'获取下一个Word文件名
wordFile = Dir()
Loop

'关闭Word应用程序
wordApp.Quit

'恢复屏幕更新
Application.ScreenUpdating = True

End Sub

步骤

  1. AreaCity 省市区镇,下载ok_data_level4.csv

  2. 创建数据库,数据表,导入数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `region`;
CREATE TABLE `region` (
`id` int(9) UNSIGNED NOT NULL COMMENT '城市编号',
`pid` int(9) NOT NULL COMMENT '上级ID',
`deep` int(1) NOT NULL COMMENT '层级深度',
`name` varchar(255) NOT NULL COMMENT '简短地区名称',
`pinyin_prefix` varchar(255) NOT NULL COMMENT '拼音前缀',
`pinyin` varchar(255) NOT NULL COMMENT '完整拼音',
`ext_id` bigint(13) NOT NULL COMMENT '数据源原始的编号',
`ext_name` varchar(255) NOT NULL COMMENT '数据源原始的完整名称',
PRIMARY KEY (`id`) USING BTREE,
INDEX `pid_idx`(`pid`) USING BTREE,
INDEX `name_idx`(`name`) USING BTREE,
INDEX `ext_name_idx`(`ext_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;
  1. 测试SQL
SELECT
t2.province_name 省, t2.city_name 市, t2.district_name 区, t2.county_name "乡/县/街道"
FROM
(
SELECT
r.id province_code, r.name province_name, r1.name city_name, r2.name district_name, r3.name county_name
FROM
region r
LEFT JOIN region r1 ON r.id = r1.pid AND r1.deep = 1
LEFT JOIN region r2 ON r1.id = r2.pid AND r2.deep = 2
LEFT JOIN region r3 ON r2.id = r3.pid AND r3.deep = 3
WHERE
r.deep = 0
) t2
WHERE
-- '亚运村街道' 替换为需要补全或检索的地址关键词
(
INSTR ( '亚运村街道', t2.province_name )
OR INSTR ( '亚运村街道', t2.city_name )
OR INSTR ('亚运村街道', t2.district_name)
OR INSTR ('亚运村街道', t2.county_name)
)
AND INSTR ( '亚运村街道', t2.county_name)

参考