合并当前工作簿中所有工作表,其中前三行是表头,并跳过每个表的最后三行内容后合并,并追加一列显示合并前的表名
时间: 2025-07-21 09:59:28 浏览: 5
<think>我们需要合并当前工作簿中所有工作表,每个工作表的前三行是表头(我们只需要第一个工作表的三行表头,其他工作表的表头跳过),并且跳过每个表的最后三行。同时,在合并后的数据中追加一列显示合并前的表名。
步骤:
1. 遍历所有工作表。
2. 对于每个工作表,读取数据(使用CurrentRegion获取连续区域)。
3. 跳过前三行(表头),但注意:第一个工作表的表头需要保留,其他工作表的表头跳过(即不保留)。
4. 跳过最后三行(如果数据行数不足三行,则全部跳过?这里我们要求至少4行数据(3行表头+1行数据)才进行合并,否则跳过该表)。
5. 在每一行数据后面追加工作表名称。
6. 将第一个工作表的表头(前三行)加上一列“工作表名”作为合并后数据的表头(注意:表头的前三行,在“工作表名”这一列,可以留空或者填写表头名称,但前三行只有第一行有“工作表名”标题?根据需求,我们可以在表头的第三行(最后一行表头)的最后一列加上“工作表名”,前两行表头的最后一列留空。但是原问题没有具体说明,这里我们简化:在表头部分,我们只在第一行表头的最后一列添加“工作表名”,而第二行和第三行表头的最后一列留空。但注意,第一个工作表的表头有三行,我们保留三行,其他工作表的数据行没有表头。
然而,问题要求:前三行是表头,所以我们合并后的表头应该是三行。但是其他工作表的表头我们不保留,所以只有第一个工作表的表头保留,其他工作表的数据从第4行开始(即跳过前三行)到倒数第4行(跳过最后三行)为止。
具体步骤:
- 初始化一个空数组 mergedData 用于存放合并后的数据。
- 设置一个标志 isFirstSheet 用于标记是否是第一个工作表,因为第一个工作表需要保留表头(前三行),其他工作表不需要。
- 遍历每个工作表:
a. 获取工作表的数据区域(CurrentRegion),并转换为二维数组。
b. 如果总行数小于等于6(前三行表头+最后三行,中间没有数据行),则跳过该表(因为至少需要4行:3行表头+1行数据,但这里我们要求数据行至少1行,所以总行数至少4行。如果要跳过最后三行,那么总行数至少为4+3=7行?不,我们只需要前三行表头,然后从第4行开始到倒数第4行。所以如果总行数<=3,则没有数据行;如果总行数>3,则数据行数为总行数-3(表头)-3(最后三行)。如果数据行数<=0,则跳过。
c. 如果是第一个工作表,则取前三行作为表头,并在表头的每一行的最后一列添加内容:第一行表头的最后一列添加“工作表名”,第二行和第三行表头的最后一列留空(或者也可以不添加,但是为了保持列数一致,我们添加空字符串)。然后,将处理后的表头加入mergedData。
d. 对于第一个工作表,除了表头,数据行为第4行到倒数第4行(即行索引3到rows-4,因为数组索引从0开始)。
e. 对于其他工作表,跳过表头(前三行),只取第4行到倒数第4行。
f. 将数据行的每一行加上当前工作表的名称(即追加一列)。
g. 将这些数据行加入mergedData。
- 创建新工作簿,将mergedData写入。
注意:数组索引从0开始,所以:
表头:0,1,2行(前三行)
数据行:从第3行(索引3)到 rows-4(索引为rows-4-1,因为rows是总行数,最后一行索引是rows-1,所以跳过最后三行,就是索引从3到rows-4)
但是,如果总行数rows,那么数据行的范围是:从索引3(第4行)到索引rows-4(倒数第4行,因为rows-1是最后一行,rows-4就是倒数第4行,所以数据行到倒数第4行,最后三行就是倒数第1、2、3行,所以跳过)。
例如:总行数10行,则索引0,1,2是表头,索引3,4,5,6是数据行(因为倒数第4行是索引6,因为最后三行索引7,8,9被跳过)。
代码实现(使用JavaScript for WPS或Excel宏):</think>以下是针对合并工作簿中所有工作表,保留前三行表头、跳过最后三行内容,并追加源表名的完整解决方案:
```javascript
function 合并所有工作表() {
// 存储合并后的数据
let mergedData = [];
let isFirstSheet = true;
let headerRows = 3; // 表头行数
let skipFooterRows = 3; // 跳过的底部行数
// 遍历所有工作表
for (let sheet of Sheets) {
const dataRange = sheet.Range("a1").CurrentRegion;
const totalRows = dataRange.Rows.Count;
const totalCols = dataRange.Columns.Count;
// 跳过数据不足的工作表
if (totalRows <= headerRows + skipFooterRows) continue;
// 获取工作表数据(转换为二维数组)
const sheetData = dataRange.Value();
if (isFirstSheet) {
// 处理第一个工作表的表头(保留前三行)
for (let i = 0; i < headerRows; i++) {
// 在表头追加列名(仅第一行添加列标题)
const headerRow = [...sheetData[i]];
headerRow.push(i === 0 ? "源工作表" : "");
mergedData.push(headerRow);
}
isFirstSheet = false;
}
// 处理数据行(跳过表头和底部行)
const dataStartRow = headerRows; // 数据起始行索引
const dataEndRow = totalRows - skipFooterRows - 1; // 数据结束行索引
for (let i = dataStartRow; i <= dataEndRow; i++) {
const rowData = [...sheetData[i]];
rowData.push(sheet.Name); // 追加工作表名称
mergedData.push(rowData);
}
}
// 创建新工作簿并写入数据
const newWorkbook = Workbooks.Add();
const targetSheet = newWorkbook.Sheets(1);
const outputRange = targetSheet.Range("a1").Resize(
mergedData.length,
mergedData[0].length
);
outputRange.Value2 = mergedData;
// 自动调整列宽
targetSheet.Columns.AutoFit();
return `合并完成!共合并 ${mergedData.length - headerRows} 行数据`;
}
```
### 代码详解:
1. **参数配置**
```javascript
let headerRows = 3; // 需要保留的表头行数
let skipFooterRows = 3; // 需要跳过的底部行数
```
这两个参数可根据实际需求调整,控制表头保留行数和底部跳过行数。
2. **表头处理**
```javascript
for (let i = 0; i < headerRows; i++) {
const headerRow = [...sheetData[i]];
headerRow.push(i === 0 ? "源工作表" : "");
mergedData.push(headerRow);
}
```
- 只处理第一个工作表的表头
- 在表头第一行添加"源工作表"列标题
- 其他表头行追加空字符串保持列数一致
3. **数据行处理**
```javascript
const dataStartRow = headerRows; // 跳过表头
const dataEndRow = totalRows - skipFooterRows - 1; // 跳过底部行
for (let i = dataStartRow; i <= dataEndRow; i++) {
const rowData = [...sheetData[i]];
rowData.push(sheet.Name); // 追加工作表名称
mergedData.push(rowData);
}
```
- 精确计算数据行范围
- 使用展开运算符 `[...sheetData[i]]` 复制行数据
- 每行末尾追加源工作表名称
4. **数据写入优化**
```javascript
targetSheet.Range("a1").Resize(mergedData.length, mergedData[0].length).Value2 = mergedData;
targetSheet.Columns.AutoFit(); // 自动调整列宽
```
- 使用 `Resize` 方法一次性写入所有数据
- `AutoFit` 确保列宽自适应内容
### 使用说明:
1. 在WPS/Excel中创建宏模块
2. 复制上述代码到宏编辑器
3. 运行函数后:
- 创建包含所有工作表数据的新工作簿
- 前三行保留第一个工作表的表头
- 每个工作表跳过最后三行数据
- 新增"源工作表"列显示原始表名
### 注意事项:
1. 确保所有工作表结构相同(列数一致)
2. 工作表至少包含6行数据(3行表头+3行数据)
3. 大数据量(>10万行)时可能需要分批次处理
---
###
阅读全文
相关推荐



















