WPS
WPS Office 多子工作表合并工具
本文档使用 MrDoc 发布
-
+
首页
WPS Office 多子工作表合并工具
## 项目名称 WPS Office 多子工作表合并工具 ## 作者 Ivan Zhang ## 日期 2024/07/28 ## 描述 此 JavaScript 模块用于在 WPS Office 中将多个子工作表合并到一个新的汇总工作表中。该模块通过读取配置工作表中的需要合并的子工作表信息,清理空行,并将所有子工作表的数据合并到一个新的汇总工作表中,同时保留标题行。 ## 主要功能 1. **读取配置工作表中的子工作表名称** 2. **创建或清理汇总工作表** 3. **获取并设置汇总工作表的标题行** 4. **合并所有子工作表的数据到汇总工作表** 5. **定位到汇总工作表的第一个单元格** 6. **弹出消息提示合并完成** ## 实现步骤 ### 步骤 1:主函数 `mergeSheets` 1. 获取配置工作表 `MergeTool`。 2. 调用 `createOrClearSummarySheet` 函数创建或清理汇总工作表。 3. 调用 `getSheetsToMerge` 函数获取需要合并的子工作表列表。 4. 调用 `getMaxHeaderRow` 函数找出标题行最多的子工作表。 5. 调用 `setSummarySheetHeader` 函数设置汇总工作表的标题行。 6. 调用 `mergeChildSheetsToSummary` 函数合并所有子工作表的数据到汇总工作表。 7. 定位到汇总工作表的第一个单元格。 8. 弹出消息提示合并完成。 ### 步骤 2:获取工作表对象 `getSheetByName` 遍历所有工作表,找到名称匹配的工作表并返回其对象。如果未找到则返回 `null`。 ### 步骤 3:创建或清理汇总工作表 `createOrClearSummarySheet` 1. 调用 `getSheetByName` 函数获取汇总工作表 `汇总` 对象。 2. 如果汇总工作表不存在,创建一个新工作表并命名为 `汇总`。 3. 如果汇总工作表存在,清空其内容。 4. 返回汇总工作表对象。 ### 步骤 4:获取需要合并的子工作表列表 `getSheetsToMerge` 1. 从配置工作表 `MergeTool` 中读取需要合并的子工作表名称。 2. 对于每个子工作表名称,调用 `getSheetByName` 函数获取对应的工作表对象。 3. 将有效的工作表对象添加到列表 `sheetsToMerge` 中并返回。 ### 步骤 5:找出所有子工作表中标题行最多的行数 `getMaxHeaderRow` 1. 遍历所有子工作表,调用 `getHeaderRow` 函数获取各个子工作表的标题行。 2. 记录标题行最多的行数并返回。 ### 步骤 6:获取子工作表的标题行 `getHeaderRow` 1. 查找并返回子工作表的第一个非空行作为标题行。 ### 步骤 7:设置汇总工作表的标题行 `setSummarySheetHeader` 1. 找到具有最多标题行的子工作表。 2. 将该子工作表的标题行复制到汇总工作表的第一行。 ### 步骤 8:合并子工作表内容到汇总工作表 `mergeChildSheetsToSummary` 1. 遍历所有子工作表,对于每个子工作表: - 获取其标题行号和第一行数据行号。 - 清理子工作表前面的空行。 - 获取子工作表的数据范围并复制。 - 将数据粘贴到汇总工作表的相应位置。 - 更新汇总工作表的下一行位置。 ## 最终代码 ```js /** * WPSMerger 模块 * * 这是一个用于在 WPS Office 中合并多个子工作表到一个新的汇总工作表的 JavaScript 模块。 * 该模块包括多个功能函数,能够从配置工作表中读取需要合并的子工作表,清理空行, * 并将所有子工作表的数据合并到一个新的汇总工作表中,同时保留标题行。 * * 作者: Ivan Zhang * 邮箱: zwb5370@gmail.com * 日期: 2024/07/28 */ /** * 主函数:合并多个子工作表到一个新的汇总工作表 */ function mergeSheets() { var app = Application; // 获取配置工作表 "MergeTool" var mergeToolSheet = getSheetByName("MergeTool"); if (!mergeToolSheet) { alert("未找到配置工作表(MergeTool)"); return; } // 创建或清理汇总工作表 var summarySheet = createOrClearSummarySheet(app); // 获取需要合并的子工作表 var sheetsToMerge = getSheetsToMerge(mergeToolSheet); // 找出标题行最多的工作表标题行 var maxHeaderRow = getMaxHeaderRow(sheetsToMerge); // 设置汇总工作表的标题行 setSummarySheetHeader(summarySheet, sheetsToMerge, maxHeaderRow); // 合并子工作表内容到汇总工作表 mergeChildSheetsToSummary(sheetsToMerge, summarySheet, maxHeaderRow); // 定位到汇总工作表的第一个单元格 summarySheet.Activate(); summarySheet.Cells(1, 1).Select(); // 弹出消息提示合并完成 alert("合并工作表重新生成成功"); } /** * 通过工作表名称获取工作表对象 * @param {string} sheetName - 工作表名称 * @returns {object|null} - 返回对应工作表对象,如果未找到则返回null */ function getSheetByName(sheetName) { var app = Application; // 遍历所有工作表,找到匹配名称的工作表 for (var i = 1; i <= app.Sheets.Count; i++) { if (app.Sheets.Item(i).Name == sheetName) { return app.Sheets.Item(i); } } return null; } /** * 创建或清理汇总工作表 * @param {object} app - WPS应用对象 * @returns {object} - 返回汇总工作表对象 */ function createOrClearSummarySheet(app) { var summarySheet = getSheetByName("汇总"); if (!summarySheet) { // 如果汇总工作表不存在,创建一个新工作表并命名为 "汇总" summarySheet = app.Sheets.Add(null, app.Sheets.Item(1)); summarySheet.Name = "汇总"; } else { // 如果汇总工作表存在,清空其内容 summarySheet.UsedRange.Clear(); } return summarySheet; } /** * 从配置工作表中获取需要合并的子工作表列表 * @param {object} mergeToolSheet - 配置工作表对象 * @returns {Array} - 返回需要合并的子工作表对象数组 */ function getSheetsToMerge(mergeToolSheet) { var sheetsToMerge = []; var row = 1; // 从配置工作表中读取需要合并的子工作表名称 while (mergeToolSheet.Cells.Item(row, 1).Value2) { var sheetName = mergeToolSheet.Cells.Item(row, 1).Value2; var sheet = getSheetByName(sheetName); if (sheet) { sheetsToMerge.push(sheet); } row++; } return sheetsToMerge; } /** * 找出所有子工作表中标题行最多的行数 * @param {Array} sheets - 需要合并的子工作表对象数组 * @returns {number} - 返回标题行的最大行数 */ function getMaxHeaderRow(sheets) { var maxHeaderRow = 1; // 遍历所有子工作表,找出标题行最多的工作表 sheets.forEach(function(sheet) { var headerRow = getHeaderRow(sheet); if (headerRow > maxHeaderRow) { maxHeaderRow = headerRow; } }); return maxHeaderRow; } /** * 获取子工作表的标题行(第一个非空行) * @param {object} sheet - 子工作表对象 * @returns {number} - 返回标题行的行号 */ function getHeaderRow(sheet) { var row = 1; var maxRows = sheet.UsedRange.Rows.Count; // 找到子工作表的标题行(第一个非空行) while ((sheet.Cells(row, 1).Text === null || sheet.Cells(row, 1).Text === "") && row <= maxRows) { row++; } return row; } /** * 设置汇总工作表的标题行 * @param {object} summarySheet - 汇总工作表对象 * @param {Array} sheets - 需要合并的子工作表对象数组 * @param {number} maxHeaderRow - 标题行的最大行数 */ function setSummarySheetHeader(summarySheet, sheets, maxHeaderRow) { var app = Application; // 找到具有最多标题行的工作表 var headerSheet = sheets.find(sheet => getHeaderRow(sheet) == maxHeaderRow); // 复制该工作表的标题行作为汇总工作表的标题行 var header = headerSheet.Rows.Item(maxHeaderRow).EntireRow; header.Copy(); summarySheet.Rows.Item(1).PasteSpecial(-4104); // -4104 is the PasteSpecial value for xlPasteAll } /** * 合并子工作表内容到汇总工作表 * @param {Array} sheets - 需要合并的子工作表对象数组 * @param {object} summarySheet - 汇总工作表对象 * @param {number} maxHeaderRow - 标题行的最大行数 */ function mergeChildSheetsToSummary(sheets, summarySheet, maxHeaderRow) { var summaryRow = 2; sheets.forEach(function(sheet) { var headerRow = getHeaderRow(sheet); var firstDataRow = headerRow + 1; // 清理子工作表前面的空行 while (sheet.Cells(firstDataRow, 1).Text === null || sheet.Cells(firstDataRow, 1).Text === "") { firstDataRow++; } // 获取子工作表的数据范围,数据区域最后行号为 实际行数 + 第一行数据位置 - 标题和第一行数据位置2行 var dataRangeRowsCount = sheet.UsedRange.Rows.Count + firstDataRow - 2 var dataRange = sheet.Range(sheet.Cells.Item(firstDataRow, 1), sheet.Cells.Item(dataRangeRowsCount, sheet.UsedRange.Columns.Count)); dataRange.Copy(); // 粘贴数据到汇总工作表 summarySheet.Cells.Item(summaryRow, 1).PasteSpecial(-4104); // -4104 is the PasteSpecial value for xlPasteAll summaryRow += dataRange.Rows.Count; }); } ``` ## 结论 上述实现方案详细地说明了如何通过 JavaScript 宏在 WPS Office 中将多个子工作表合并到一个新的汇总工作表中。具体步骤包括读取配置工作表、创建或清理汇总工作表、设置汇总工作表的标题行以及合并子工作表的数据。最后,通过定位到汇总工作表的第一个单元格并弹出合并完成的提示,用户可以直观地看到合并的结果。 如果需要进一步的改进或定制,可以在现有的基础上添加额外的功能,例如更多的数据清理和验证步骤,以确保数据的准确性和一致性。
七宇轩远
2024年07月28日
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码