本文重點講解第一步,手動在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表中的數據,有可能不是很規范,需要處理后才是嚴格的行列數據,才能入庫。
-完-