用powershell+excel行列轉置三步走


 

本文重點講解第一步,手動在excel表中輸入公式,或者用powershell自動輸入公式。

第二步,用powershell向excel中寫入數據,略。

第三步,用powershell從excel中讀取數據,略。

本人原創拙作,聲明網上唯一。

搜索過的關鍵字:powershell excel 行列 轉置 轉換  

搜索過的引擎:百度 bing

powershell 傳教士 原創文章 2014-07-12,2015-03-03,2016-07-17 修改。 允許轉載,但必須保留名字和出處,否則追究法律責任

---【第一章 概述】---

    用excel + powershell來數據處理,太方便。 大型數據處理當然要用幾種主流的數據庫了,這不用多說。對於差不多少於一億條的【中小型】數據處理, 建議用excel+powershell來處理。優點如下:

1  excel是c代碼的編譯程序,性能沒問題,要比powershell處理得快。64位win的話,用64位excel就更好了。

2  excel簡單,會的人多。

3  excel可以輸出各種統計圖,表,打印。

4  每個excel單元格,可以看作是一個變量。首先設置單元格的格式,也就是變量類型是數值啊還是日期等。然后在變量中存東西。

5  每個excel公式可以看成是表達式,或者叫做存儲過程。

6  每個excel文件(工作簿),可以認為是一個數據庫。每個工作表可以看作是數據庫中的表,表中含有的行是記錄,列是字段。

7  只用powershell做存取,不做任何運算,運算都丟給excel公式!。用excel公式寫具體的數據處理算法,如第三個單元格中的內容等於第一個單元格加第二個單元格。

8  excel實際上是可以連接數據源,也就是從數據庫中存取常用的數據類型。

---【第二章 人+鍵盤+鼠標+excel 手動實現行列轉置 教程】---

    從excel2007開始, excel 支持的最大行數 = 1048576         excel 支持的最大列數 = 16384    所以excel行列轉置最多支持16384 x 16384 這樣方陣的轉置。

首先講解如何手動操作,設置轉置:

1打開excel,在sheet1中,做好一個表,如圖1

2在sheet2中,選中第一個格,輸入公式=TRANSPOSE(Sheet1!A1:D11),然后選中a1---d11,按f2,按ctrl+shift+enter

3修改第一個工作本中的內容,第二個工作本也變了,證明成功。

一般來講,建議按照上述教程,用鍵盤鼠標,手動輸入公式。而不是powershell輸入公式。而powershell只做數據讀寫。

---【第三章  用powershell向sheet1寫入數據 (略)】---

 

---【第四章  用powershell向sheet2寫入公式】---

 

一般來講,建議按照上述教程,用鍵盤鼠標,手動輸入公式。而不是powershell輸入excel公式。而powershell只做數據讀寫。當然如果你非要用excel輸入公式,那么請看:

 

# powershell 行列轉置例子

<#

行列轉置公式為:
=TRANSPOSE(Sheet1!A1:XFD16384)
{=TRANSPOSE(Sheet1!A1:CV100)}
{=TRANSPOSE(Sheet1!A1:KUR8000)}

#>

Write-Warning  '支持最大行列為 16384,行列可以不是正方形,但建議在6000 * 6000條以下,大內存可以8000 * 8000'
$script:腳本存儲路徑 = Split-Path -Parent   $myinvocation.mycommand.path
$Env:Path += ";$script:腳本存儲路徑;"

#region main
$excel文件 = 'a:\pscode\temp122\z轉置測試002.xlsx'
$excel對象 = New-Object -comobject Excel.Application
$SheetName = "sheet2"
$Excel工作簿 = $excel對象.Workbooks.Open($excel文件)
$Excel工作表 = $Excel工作簿.Worksheets.Item($SheetName)
$excel對象.Visible = $true

#region  向sheet2寫入公式
# 一般來講,建議按照上述教程,用鍵盤鼠標,手動輸入公式。而不是powershell輸入公式。而powershell只做數據讀寫。
# 沒找到直接寫入公式的方法,暫時先用笨方法。
[system.reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
$范圍1 = $Excel工作表.range("A1:CV100") 
[string]$temp0001 = '=TRANSPOSE{(}Sheet1!A1:CV100{)}'

$范圍1.select()

#此為 powershell 傳教士 原創文章 中配套的腳本 2014-07-12 

#公式欄 
sleep 1
[System.Windows.Forms.SendKeys]::SendWait("{F3}") | Out-Null

#粘貼
sleep 1
[System.Windows.Forms.SendKeys]::SendWait($temp0001) | Out-Null
sleep 1
[System.Windows.Forms.SendKeys]::SendWait("^+{ENTER}") | Out-Null

# 重新計算公式
sleep 1
[System.Windows.Forms.SendKeys]::SendWait("+{F9}") | Out-Null

sleep 1
$excel對象.Visible = $false

#powershell  行列 轉置  轉換  excel  powershell傳教士  2014-07-12
sleep 2
$excel對象.save()
sleep 2
#endregion  向sheet2寫入公式



#region 向sheet1寫入行列數據
# 略,注意,寫完保存
#endregion 向sheet1寫入行列數據



#region  從sheet2讀取值
# 略,注意,過濾 “0”值
#endregion  從sheet2讀取值


#region  掃尾
Start-Sleep 2
$Excel工作簿.close()
Remove-Item  "$home\documents\resume.xlw" -ErrorAction:SilentlyContinue
Start-Sleep 2
$excel對象.save()
sleep 2
$excel對象.Quit()


Start-Sleep 2
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($范圍1)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Excel工作表)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Excel工作簿)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel對象)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel對象)
Start-Sleep 2
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

Remove-Item  "$home\documents\resume.xlw" -ErrorAction:SilentlyContinue
Write-Host "------------end-------------"
Write-Host "---腳本運行完畢后,請輸入exit命令。或,關閉powershell窗口,后台excel.exe即可自動退出。---"
exit 0
#endregion  掃尾

#endregion main

 

---【第五章  用powershell從sheet2讀取數據 (略)】---

---【第六章  值的后續處理】---

用powershell從excel中讀取,得到m行n列的數據后,可以:

輸入,輸出xml文件-------------powershell就有Select-Xml,ConvertTo-Xml相關處理命令。

輸入,輸出json-------------ConvertFrom-Json,ConvertTo-Json

輸出html-------------ConvertTo-Html

輸入,輸出csv--------------ConvertFrom-Csv,ConvertTo-Csv,Export-Csv,Import-Csv

---【后記】---

使用【原廠】or【第三方】庫之辯:

任何語言處理excel,要么調用原廠的庫(即excel com對象),要么調用第三方的庫。

第三方插件的好處是【分離】。無需裝office。但明顯有兼容性問題。這些第三方excel庫,有些免費,有些也收費。

而office原廠excel com 插件,需要安裝office,有收費問題。但是自家東西100%兼容。

 

問:有哪些語言可以處理excel?

答: 我所知道的

java + 第三方模塊

c# + 第三方模塊

c# + excel的com對象

vbs + excel的com對象

powershell + excel的com對象

powershell + 第三方模塊

python + 第三方模塊

 

使用【程序語言】or【sql】,哪種方法處理我excel中的數據更好?之辯:

powershell+excel處理數據的本質就是。用腳本語言+【數據處理邏輯】搬箱子(excel單元格)。 這種搬箱子是必要的,比把txt,csv導入庫,然后用sql處理好太多,理由如下:

1 因為數據庫的列類型是鎖定的。而且sql在字段之間搬數據不方便。excel沒有這類問題。

2 關系型數據庫中沒有【第幾行】這個概念。

3 關系型數據庫是嚴格的行列表,而excel中有【m行合並的單元格】,【n列合並的單元格】。

4 excel表中的數據,有可能不是很規范,需要處理后才是嚴格的行列數據,才能入庫。

 

 -完-

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM