Python&JS宏 实现保留样式合并表格后拆分_python 两份excel带样式合并

本文介绍了如何使用Python和JavaScript宏来实现Excel表格的拆分,同时保留原有样式。在Python中,通过win32com模块处理Excel数据,复制标题行之前和之后的区域,根据指定列名拆分工作表,并复制列宽。在JavaScript宏中,类似地进行数据操作和拆分。两种方法均能实现带样式的表格拆分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

date = '${year}年${month}月;
console.log(date);
sht.Activate();
let max_rows = sht.Range(“B7”).End(xlDown).Row;
let max_cols = sht.Range(“B7”).End(xlToRight).Column;
n = i1?7:8;
rng = sht.Range(sht.Cells(n, 1), sht.Cells(max_rows, max_cols));
rng.Select();
Selection.Copy();
dest.Activate();
dest.Range(A${pos}).Activate();
dest.Paste();
// 复制第一张工作表的列宽
if(i
1) dest.PasteSpecial(xlPasteColumnWidths);
for(k=0;k<max_rows-7;k++) dates.push(date);
pos += max_rows-n+1;
}
Application.ScreenUpdating = true;
dest.Columns(“B:B”).Insert();
dest.Range(“B1”).Value2 = “月份”;
dest.Range(“B2”).Resize(dates.length).Value2 = WorksheetFunction.Transpose(dates);
dest.Columns.Item(“B:B”).ColumnWidth = 20;
dest.Columns.Item(“B:B”).AutoFit();
dest.Range(“A2”).Value2 = “1”;
dest.Range(“A2”).Select();
Selection.AutoFill(dest.Range(A2:A${pos-1}), xlFillDefault);
dest.Columns(“A:A”).AutoFit();
dest.Rows(1:${pos-1}).AutoFit();
dest.Name = “总表”;
wb_result.SaveAs(${wb.Path}\\${wb.Name.replace(/\.[^.]+$/,"")}\_合并.xlsx);
}

结果得到与上述完全一致的结果。

注意:COM组件提供Python的接口Resize方法失效,可以使用GetResize替代。

保留样式拆分表格的Python实现

之前的完整实现方法请查看:

深度剖析Excel表拆分的三项技术
https://xxmdmst.blog.csdn.net/article/details/118655016

今天的实现只考虑将当前工作表拆分到工作簿中的情况,相对之前的代码会有一定简化,同时增加了复制列宽的功能,重新填充编号的功能。完整代码如下:

import win32com.client as win32 # 导入模块
from win32com.client import constants
import os

def simple_split_excel(filename, group_num, title_row=1, excel_app=win32.gencache.EnsureDispatch(‘Excel.Application’)):
“”“作者小小明的csdn:https://blog.csdn.net/as604049322"”"
filename = os.path.abspath(filename)
wb = excel_app.Workbooks.Open(filename)
try:
sheet = wb.ActiveSheet
max_rows = sheet.UsedRange.Rows.Count
max_cols = sheet.UsedRange.Columns.Count

获取总表的数据区域

rng = sheet.Range(sheet.Cells(title_row, 1),
sheet.Cells(max_rows, max_cols))
if title_row > 1:

获取标题行前面的区域

start = sheet.Range(sheet.Cells(
1, 1), sheet.Cells(title_row-1, max_cols))

读取表头名称列表

header = sheet.Range(sheet.Cells(title_row, 1),
sheet.Cells(title_row, max_cols)).Value[0]

如果传入列名则找出列所在的位置

if isinstance(group_num, str):
for i, value in enumerate(header, 1):
if group_num == value:
group_num = i
break
names = sum(sheet.Range(sheet.Cells(title_row+1, group_num),
sheet.Cells(max_rows, group_num)).Value, tuple())
names = set(filter(None, names))
excel_app.ScreenUpdating = False
for name in names:
new_sheet = wb.Sheets.Add(After=wb.Sheets(wb.Sheets.Count))
new_sheet.Name = name
if title_row > 1:

先复制标题行之前的区域

wb.Activate()
sheet.Activate()
start.Copy()
new_sheet.Activate()
new_sheet.Range(“A1”).Activate()
new_sheet.Paste()
sheet.Activate()
rng.AutoFilter(Field=group_num, Criteria1=name)
rng.Copy()
new_sheet.Activate()
new_sheet.Range(f"A{title_row}").Activate()
new_sheet.Paste()
new_sheet.PasteSpecial(constants.xlPasteColumnWidths)

new_sheet.Range(“A2”).Value2 = “1”
new_sheet.Range(“A2”).Select()
max_rows = new_sheet.Range(“A1”).End(constants.xlDown).Row
excel_app.Selection.AutoFill(new_sheet.Range(
f"A2:A{max_rows}"), constants.xlFillDefault)
excel_app.ScreenUpdating = True
sheet.AutoFilterMode = False
wb.Save()
finally:
wb.Close()

调用该代码:

simple_split_excel(“异常项清理明细_合并.xlsx”, “业务系统归属业务员”)

拆分结果如下:

image-20221020230753843

保留样式拆分表格的JS宏实现

完整代码如下:

function excel表拆分() {
console.clear();
let group_num=“业务系统归属业务员”, title_row=1;
var wb=ActiveWorkbook;
var sht = wb.ActiveSheet;
var max_rows = sht.UsedRange.Rows.Count,max_cols = sht.UsedRange.Columns.Count;
// 获取总表的数据区域
rng = sht.Range(sht.Cells(title_row, 1), sht.Cells(max_rows, max_cols));
if(title_row>1){
// 获取标题行前面的区域
start = sht.Range(sht.Cells(1, 1), sht.Cells(title_row-1, max_cols));
}
// 读取表头名称
let header = sht.Range(sht.Cells(title_row, 1), sht.Cells(title_row, max_cols)).Value2[0];
// 如果传入列名则找出列所在的位置
if(typeof(group_num)==“string”){
for(i=0;i<header.length;i++){
if(group_num == header[i]){
group_num=i+1;
break;
}
}
}
Console.log(group_num);
// 获取拆分列去除空值后的所有唯一值
var names=sht.Range(sht.Cells(title_row+1, group_num), sht.Cells(max_rows, group_num)).Value2.flat();
names=Array.from(new Set(names.filter(v=>v!=undefined)));
Application.ScreenUpdating = false;
for(name of names){
new_sheet = Sheets.Add(undefined,wb.Sheets(wb.Sheets.Count));
new_sheet.Name = name;
console.log(name);
if(title_row>1) {
// 先复制标题行之前的区域
sht.Activate();
start.Copy();
new_sheet.Activate();
new_sheet.Range(“A1”).Activate()
new_sheet.Paste();
}
sht.Activate();
rng.AutoFilter(group_num, name);
rng.Copy();
new_sheet.Activate();
new_sheet.Range(A${title\_row}).Activate();
new_sheet.Paste();
new_sheet.PasteSpecial(xlPasteColumnWidths);

new_sheet.Range(“A2”).Value2 = “1”;
new_sheet.Range(“A2”).Select();
let max_rows = new_sheet.Range(“A1”).End(xlDown).Row
Selection.AutoFill(new_sheet.Range(A2:A${max\_rows}), xlFillDefault)
}
Application.ScreenUpdating = true;
sht.Activate();
sht.AutoFilterMode = false;
}

点击开发工具->JS宏,运行上述代码后即可得到与Python一样的结果,不过代码未执行保存操作,手动保存即可。

以上就是有关带格式合并与拆分表格的综合案例。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
img
img
img

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
img

]
[外链图片转存中…(img-WT5xWYdY-1712530678364)]

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-UvPM14dH-1712530678365)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值