[Powershell / VBA] 把excel中的表分离成独立的excel文件

This article also published in Eng @ http://www.cnblogs.com/LarryAtCNBlog/p/4441201.html

今天在两个地方看到了这样一个问题:把一个excel中的表复制出来另存为一个独立的excel文件。其中一个是cnblog,另一个想不起来了。想到自己将来也可能遇到这样的问题,于是用powershell做了一个脚本以备不时之需。

Powershell

当然,首先要有一个excel文件包括了一堆表。

用脚本自动化excel最常用的是COM object,下面的语句就是新建一个excel.application实例并把DisplayAlerts置为false,这样可以避开excel的告警。

$Excel = New-Object -ComObject Excel.Application
$Excel.DisplayAlerts = $false

这其实就相当于我们双击了一下excel.exe,如果想把它显示出来只需要把$Excel.Visible属性置为true即可。

下面的语句就是打开目标excel文件,该open方法仅接受绝对路径。

$WorkBook = $Excel.Workbooks.Open("$PWD\all.xlsx")

现在我们已经有了workbook的对象,我们只需要对其中的Sheets做循环复制到一个新的Workbook即可。

$WorkBook.Sheets | %{
    # 设置新的workbook的路径
    $NewWorkBookPath = "$PWD\$($WorkBook.Name)_$($_.Name).xlsx"
    # 新建一个workbook
    $NewWorkBook = $Excel.Workbooks.Add()
    # 把当前的sheet复制到这个新的workbook里面
    $_.Copy($NewWorkBook.Sheets.Item(1))
    # 默认新建一个workbook是有3个空的sheet,下面的语句是删掉这几个空的表
    2..$NewWorkBook.Sheets.Count | %{
        $NewWorkBook.Sheets.Item(2).Delete()
    }
    # 把该新的workbook另存为
    $NewWorkBook.SaveAs($NewWorkBookPath)
    # close new workbook
    $NewWorkBook.Close()
}

At last, close old workbook and excel.

最后,调用close方法关闭原来的workbook和excel

$WorkBook.Close()
$Excel.Quit()

到这里可能有人注意到任务管理器里依然有一个excel.exe存在,实际上在其它的程序语言中也会遇到同样的问题,对于该问题的答案MS已经给出了解决办法。

https://technet.microsoft.com/en-us/library/ff730962.aspx

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null

到这里工作就完成了,改良脚本就是之后的事了。

VBA

另一个方法是用office自带的宏来做这件事,打开excel按Alt + F11之后就能调用VBA editor,如果你不能的话可能是最开始安装office的时候没有选择宏组件。

VBA中的方法非常类似,只不过操作的对象不同罢了。

Sub SplitSheets()
    Application.DisplayAlerts = False
    For Each Sheet In Sheets
        NewWorkBookPath = ActiveWorkbook.FullName & "_" & Sheet.Name & ".xlsx"
        Set w = Workbooks.Add
        Sheet.Copy w.Sheets.Item(1)
        For i = 2 To w.Sheets.Count
            w.Sheets.Item(2).Delete
        Next
        w.SaveAs NewWorkBookPath
        w.Close
        Set w = Nothing
    Next
End Sub

这其实就是建了一个宏而已,在workbook界面用Alt + F8可以调用出宏界面执行它,或者在VBA editor界面按F5执行宏即可。

- Larry

时间: 2025-01-15 18:05:34

[Powershell / VBA] 把excel中的表分离成独立的excel文件的相关文章

excel多个sheet表拆分成独立的excel文件

一.问题: 公司做一个项目,给的用户上报文是一个包含多个sheet页的excel文件, 但是在实际处理报文数据的时候需要拆分excel文件为多个独立的报文excel文件 二.解决: (1)一个一个的复制,新建文件,生成新的sheet文件,sheet多的时候很麻烦 (2)使用office的宏工具来自动化拆分文件 三.操作步骤: 注意:本操作以wps为例,其它的请自行测试 (1)下载[wps vba宏插件] (2)点击 [开发工具]-->[vba编辑器]-->[插入]-->[模块] (3)复

如何将数据库中的表导成XML文件

1.现将数据库中的信息读到DataTable中 2.用函数将DataTable转为string private string ConvertDataTableToXML(DataTable dt) { if (dt != null) { MemoryStream ms = null; XmlTextWriter XmlWt = null; try { ms = new MemoryStream(); XmlWt = new XmlTextWriter(ms, Encoding.Unicode);

将Excel的数据表转成数据库表

如果你有很多数据要导进数据库的表,敲代码恐怕效率不高,而对于数据操作,Excel在这方面就有优势,但如何将之有机结合呢?将Excel的数据表转成数据库表,这就是本篇博客的目的. 首先去下载MySQL皮肤(对MySQL数据进行图形化界面操作的便捷工具),点击打开皮肤下载链接. 然后连接数据库,进行操作 继续下一步结束之后会发现世界很美好.

Office 2016 - 下载、安装、激活后,右键新建菜单中,出现 Micorosoft Excel 97-2003 工作表,而不是 Micorosoft Excel 工作表、以及对新建菜单项位置做调整

安装激活 Office 2016 后,新建菜单项如下: 首先,需要做的是把右键新建菜单项中的 Micorosoft Excel 09-2003 工作表去除(保存格式是 .xls),替换为 Micorosoft Excel 工作表(Excel 2016 的默认格式 .xlsx) 其次,对新建菜单项的排列顺序做调整,额,把 Micorosoft Excel 工作表 移至 Micorosoft Word 文档下面. 调整后样式:

EXCEL VBA中写了个宏把本EXCEL中的表数据批量导出为csv格式的文件

Sub csv()    Dim Fs, myFile As Object    Dim myfileline As String 'txtfile的行数据    Dim sht As Worksheet        For Each sht In ThisWorkbook.Sheets        ns = sht.Cells(1, 8)        Set Fs = CreateObject("Scripting.FileSystemObject")   '建立filesyt

如何在excel中把汉字转换成拼音

---恢复内容开始--- 1.启动Excel 2003(其它版本请仿照操作),打开相应的工作表: 2 2.执行“工具→宏→Visual Basic编辑器”命令(或者直接按“Alt+F11”组合键),进入Visual Basic编辑状态: 3 3.执行“插入→模块”命令,插入一个新模块.再双击插入的模块,进入模块代码编辑状态: Function pinyin(p As String) As String i = Asc(p) Select Case i Case -20319 To -20318:

数据库中的表转换为实体类(.java文件)

在Myeclipse中配置连接数据库,将表转换为.java文件,节约时间,提高编程效率. 在Myeclipse中 点击window -->open perspective -->other  -->Myeclipse  Hibernate  界面上会出现DB Broswer区域,在它的区域中点击右键 -->new 在DB Browser中会出现刚才注册的Drivername 找到需要的表,右键 -->Hibernate Reserve Engineering    -->

VBA在Excel中的应用(三)

目录  Chart Export Chart Format Chart Lengend  Chart Protect  Chart Title  Chart Chart Export 1. 将Excel中的图表导出成gif格式的图片保存到硬盘上 Sub ExportChart()     Dim myChart As Chart     Set myChart = ActiveChart     myChart.Export Filename:="C:\Chart.gif", Filt

SqlServer表数据与excel中数据的互相复制

一.SqlServer表数据复制到excel 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键,复制(也可以点击连同标题复制),复制到记事本中(不然会乱码) 3.然后再把记事本的内容复制,在excel中粘贴就可以了. 二.excel复制到SqlServer表数据 1.打开excel复制数据. 2.用编辑状态打开sql表 3.右键点击表最下面一行左侧的序号,选择粘贴(注意,excel的列一定要和sql表的列对应) 4.如果有自增,不要复制自增字段