Быстрая генерация Excel - PullRequest
       4

Быстрая генерация Excel

4 голосов
/ 17 марта 2011

Я строю категоризированный список задач (не как функцию или что-то еще, просто быстрый, не по назначению список). Список должен быть организован так:

Category1  
-----------Item1  
-----------Item2  
Category2  
-----------Item1  (always the same items in each category)  
-----------Item2  

Итак, у меня есть 2 текстовых файла, 1 с категориями и один с элементами.

Если бы это была проблема с базой данных, я бы сделал декартово объединение, и результат был бы довольно близок к тому, что я хочу.

Что я хочу сделать, так это взять эти 2 файла и выбросить файл Excel, где первый столбец - это категория, а второй - элементы.

Я начал писать небольшую C # -программу для грубой силы, но мне просто кажется, что я что-то упустил - есть ли макрос или, может быть, даже содержательный сценарий PowerShell, который я мог бы собрать вместе, чтобы сделать это? Просто кажется, что это должно быть так просто.

Ответы [ 5 ]

3 голосов
/ 17 марта 2011

Попробуйте это:

 $(foreach($c in cat .\categories.txt) { 
    foreach ($i in cat .\items.txt) {
        New-Object PSObject -Property @{
            Category = $c
            Item = $i
        }
    } 
}) | Format-Table -GroupBy Category -Property Item

Category: category1

Item                                                                                                                        
----                                                                                                                        
item1                                                                                                                       
item2                                                                                                                       
item3                                                                                                                       
item4                                                                                                                       


   Category: category2

Item                                                                                                                        
----                                                                                                                        
item1                                                                                                                       
item2                                                                                                                       
item3                                                                                                                       
item4                                                                                                                       
2 голосов
/ 17 марта 2011

Если вы действительно ищете быстрое и грязное решение, вы можете быстро написать код VB / C #, чтобы объединить два файла в один CSV и открыть их в Excel, чтобы продолжить работу. Если вам требуется больше манипуляций с файлом на лету, я рекомендую вам прочитать ссылку, размещенную здесь.

Для чтения / записи из таблицы Excel с использованием C #

С уважением, Энди.

1 голос
/ 01 апреля 2011

Вот способ получить его в Excel. Я думаю, что вы хотите тире, а не повторять название категории. Правильно?

$(foreach($c in cat .\categories.txt) {
    foreach ($i in cat .\items.txt) {
        New-Object PSObject -Property @{
            Category = $c
            Item = $i
        }
    }
}) | select Category, Item | Export-Csv -NoTypeInformation $pwd\test.csv; Invoke-Item $pwd\test.csv
1 голос
/ 17 марта 2011

Я не знаю о C #, но я сделал что-то вроде на VB.

Все, что я делал, это использовал библиотеки, которые есть в .NET, также для создания книги Excel, я начал записывать макрос того, как я этого захочу, тогда это было просто вопросом применения этого макроса к моей программе VB.

Этот ответ не может помочь вам всем, я просто надеюсь, что он укажет вам правильное направление, просто позвольте мне найти пример, и я с радостью поделюсь им

EDTI Я нашел несколько ссылок, надеюсь, они работают

Форумы MSDN

CodeProject.com

0 голосов
/ 17 марта 2011

Это автономно и показывает пару техник, которые я нашел полезными.Вы будете очень разочарованы скоростью Excel, но моим пользователям нравится видеть на экране красивые вещи, а не .csv.

Param 
(
    [parameter(Mandatory=$false)]
    [string]$targetFile = 'D:\cafp1\middleware\restricted\middleware\IIS\PowerShell\Demos\excel\test.xls'
)

begin
{
    Set-StrictMode -version Latest



    function configureSheet
    {
        param (
            [parameter(Mandatory=$true)]
            $appExcel,
            [parameter(Mandatory=$true)]
            $appWorkbook,
            [parameter(Mandatory=$true)]
            $worksheetName
        )

        # Get the appropriate sheet
        $sheetNumber = 1
        $headerSheet = $appWorkbook.WorkSheets.Item($sheetNumber)
        $headerSheet.Activate()
        $headerSheet.Name = $worksheetName

        # Place the intro text
        $introRowNumber = 1
        $introColumnNumber = 1
        $headerSheet.Cells.Item($introRowNumber,$introColumnNumber) = "Intro Text"

        # Freeze panes for easy navigation
        $freezeCell = "a2"
        [void]$headerSheet.Range($freezeCell).Select()
        $headerSheet.application.activewindow.FreezePanes = $true

        # Configure headers
        $headerSheet.Cells.Item(2,1) = "Header 1"
        $headerSheet.Columns.Item(1).ColumnWidth = 15
        $headerSheet.Cells.Item(2,2) = "Header 2"
        $headerSheet.Columns.Item(2).ColumnWidth = 25

        $headerTitles = $headerSheet.UsedRange
        $headerTitles.Interior.ColorIndex = 40
        $headerTitles.Font.ColorIndex = 9
        $headerTitles.Font.Bold = $True

        $firstDataRow = 3
        [void]$headerSheet.Cells.Item($firstDataRow,1).Activate()

        $headerSheet

    }

    function reportObject
    {
        param (
            [parameter(Mandatory=$true)]
            $sheet,
            [parameter(Mandatory=$true)]
            $activeRowNumber,
            [parameter(Mandatory=$true)]
            $variant
        )
        # I took out a lot of logic to allow complex objects to be reported. This is easy to extend, though.
        $sheet.Cells.Item($activeRowNumber,1) = $variant.Category
        $sheet.Cells.Item($activeRowNumber,2) = $variant.Item
    }


    $appExcel = New-Object -comObject Excel.Application
    $appExcel.visible = $true
    $appExcel.ScreenUpdating = $true

    $appWorkbook = $appExcel.Workbooks.Add()
    $originalCalculationState = $appExcel.Calculation
    $appExcel.Calculation = -4135 # Magic number to disable calculation
    $appWorkbook.Title = "Title in Properties"
    $appWorkbook.Subject = "Subject in Properties"


    $currentSheet = "WorkSheet Name"
    $sheet = $false
}

process
{

    $sheet = configureSheet `
        -appExcel $appExcel `
        -appWorkbook $appWorkbook `
        -worksheetName $currentSheet

    $activeRow = 3

    $record = New-Object PSObject
    add-member -InputObject $record Noteproperty 'Category' "Category1"
    add-member -InputObject $record Noteproperty 'Item' ""

    reportObject `
        -sheet $sheet `
        -activeRowNumber $activeRow `
        -variant $record


}

end
{

    # Save and close this workbook
    $headerSheet = $appWorkbook.WorkSheets.Item(1) 

    $row = 3
    $column = 1
    [void]$headerSheet.Cells.Item($row,$column).Select()
    [void]$appExcel.Selection.AutoFilter()
    [void]$headerSheet.Cells.Item($row,$column).Activate()

    $appExcel.Calculation = $originalCalculationState

    # Excel defaults to My Documents as the home folder
    $appExcel.DisplayAlerts = $false
    $appWorkbook.SaveAs($targetFile,1)
    $appWorkbook.Close()
    # Do this to get PowerShell Console to really kill the Excel object.
    # PowerShell ISE will only really kill Excel once it itself is killed.
    [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($appExcel)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...