Как перебрать столбец Excel, чтобы прочитать значения ячеек, которые будут использоваться в качестве номеров файлов для моего кода PDFmerge для работы? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть этот код vb.net, который отлично подходит для объединения всех PDF-файлов в пути к каталогу на основе критериев, содержащихся в PDF-файле. Новая проблема заключается в том, что в этом каталоге будет более 1000 PDF-файлов, а у пользователя будет список конкретных PDF-файлов по имени файла в столбце Excel, который необходимо будет разделить / объединить по указанным критериям для конкретного дня.

скажем, например, каталог имеет

ZTEST11.SAMPLE01

ZTEST12.SAMPLE02

ZTEST13.SAMPLE03

ZTEST14.SAMPLE04

ZTEST15.SAMPLE05

ZTESTN + 1 ....

Но из всех перечисленных в моем файле Excel только в столбце A (и номера строк будут меняться ежедневно):

ZTEST11.SAMPLE01

ZTEST13.SAMPLE03

ZTEST15.SAMPLE05

Так что это единственные файлы, на которые я хочу, чтобы мой код влиял.

Мой код такой

Модуль Модуль1

Class PageType
    Property Identifier As String
    Property TypeName As String
End Class

Sub Main(ByVal args As String())
    Dim xlApp As Excel.Application
    Dim xlWorkBook As Excel.Workbook
    Dim xlWorkSheet As Excel.Worksheet
    Dim range As Excel.Range
    xlApp = New Excel.Application
    xlWorkBook = xlApp.Workbooks.Open("C:\Users\XBorja.RESURGENCE\Desktop\xavier.xlsx")
    xlWorkSheet = xlWorkBook.Worksheets("sheet1")

    range = xlWorkSheet.UsedRange


    Dim dir = "G:\Word\Department Folders\Pre-Suit\Drafts-IL\2-IL_AttyReview\2018-09\Reviewed\"

    Dim unmerged = Combine(dir, "unmerged")
    ' Set up a list of the identifiers to be searched for and the corresponding names to be used in the filename.
    Dim pageTypes As New List(Of PageType)
    Dim ids = {"COVERSPLIT", "COMPLAINTSPLIT", "EXHIBITSPLIT", "MILSPLIT", "SUMSPLIT"}
    Dim nams = {" Cover Sheet ", " Complaint ", " Exhibit ", " Military ", " Summons "}

    ' For Each inputfile As String In Directory.GetFiles(dir, "*.pdf")
    For Each aCell In range

        MsgBox(aCell.Value)


        For Each inputfile As String In Combine(dir, aCell.value)
            For i = 0 To ids.Length - 1


                pageTypes.Add(New PageType With {.Identifier = ids(i), .TypeName = nams(i)})
            Next

            xlWorkBook.Close()
            xlApp.Quit()
            releaseObject(xlApp)
            releaseObject(xlWorkBook)
            releaseObject(xlWorkSheet)

            Dim extractor As New TextExtractor()

            ' Load sample PDF document
            extractor.LoadDocumentFromFile(inputfile)

            Dim pageCount = extractor.GetPageCount()
            Dim currentPageTypeName = "UNKNOWN"
            Dim Path As String = IO.Path.GetFileNameWithoutExtension(inputfile)
            Dim extracted = Path.Substring(0, 7)
            ' Search each page for a keyword 

            For i = 0 To pageCount - 1

                ' Find the type of the current page
                ' If it is not present on the page, then the last one found will be used.
                For Each pt In pageTypes
                    If extractor.Find(i, pt.Identifier, False) Then
                        currentPageTypeName = pt.TypeName
                    End If
                Next


                ' Extract page
                Using splitter As New DocumentSplitter() With {.OptimizeSplittedDocuments = True}
                    Dim pageNumber = i + 1   ' (!) page number in ExtractPage() is 1-based

                    If Not Directory.Exists(dir & "\unmerged") Then
                        Directory.CreateDirectory(dir & "\unmerged")
                    End If

                    Dim outputfile = Combine(unmerged, extracted & currentPageTypeName & pageNumber & ".pdf")

                    splitter.ExtractPage(inputfile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber & " to file """ & outputfile & """")

                End Using

            Next
            extractor.Dispose()

        Next ' for each 
    Next




    Call Xavier()
End Sub

Как вы можете видеть, я добавил в этой части, чтобы моя книга Excel открылась, и зачитал мне каждое значение ячейки в столбце A, которое является номерами файлов PDF, которые я хочу объединить.

Это отлично работает. Но как мне получить эти значения в моем коде, чтобы код знал, какие именно PDF-файлы я хочу объединить в выбранном каталоге?

Вы можете увидеть, что я прокомментировал: для каждого входного файла в виде строки в Directory.GetFiles (dir, "* .pdf")

Это то, что я использовал раньше, чтобы мой код объединял все PDF-файлы в этом каталоге на основе критериев, которые я определил.

Как мне исправить это, чтобы значения моих ячеек превратились в строковые значения, чтобы мой код мог перебирать каждое значение ячейки в виде файла PDF в моем каталоге, чтобы выбрать их для слияния?

1 Ответ

0 голосов
/ 12 сентября 2018

Решение:

Option Infer On
'Option Strict On

Imports Bytescout.PDFExtractor
Imports System.Collections
Imports System.Collections.Generic
Imports System.IO.Path
Imports System.IO
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Imports System
Imports System.Diagnostics
Imports PdfSharp.Pdf
Imports PdfSharp.Pdf.IO
Imports System.Deployment
Imports ExcelDataReader
Imports Microsoft
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports Microsoft.Office.Interop.Excel


Module Module1

    Class PageType
        Property Identifier As String
        Property TypeName As String
    End Class

    Sub Main(ByVal args As String())
        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim range As Excel.Range
        Dim aCell As Object

        xlApp = New Excel.Application
        xlWorkBook = xlApp.Workbooks.Open("C:\Users\XBorja.RESURGENCE\Desktop\xavier.xlsx")
        xlWorkSheet = xlWorkBook.Worksheets("sheet1")

        range = xlWorkSheet.UsedRange


        Dim dir = "G:\Word\Department Folders\Pre-Suit\Drafts-IL\2-IL_AttyReview\2018-09\Reviewed\"
        'Dim inputfile = Combine(dir, Obj.value)
        Dim unmerged = Combine(dir, "unmerged")
        ' Set up a list of the identifiers to be searched for and the corresponding names to be used in the filename.
        Dim pageTypes As New List(Of PageType)
        Dim ids = {"COVERSPLIT", "COMPLAINTSPLIT", "EXHIBITSPLIT", "MILSPLIT", "SUMSPLIT"}
        Dim nams = {" Cover Sheet ", " Complaint ", " Exhibit ", " Military ", " Summons "}

        ' For Each inputfile As String In Directory.GetFiles(dir, "*.pdf")
        For Each aCell In range
            MsgBox(aCell.Value)

            Dim file1 = aCell.Value & ".pdf"


            For Each inputfile As String In Directory.GetFiles(dir, file1)
                For i = 0 To ids.Length - 1


                    pageTypes.Add(New PageType With {.Identifier = ids(i), .TypeName = nams(i)})
                Next



                Dim extractor As New TextExtractor()

                ' Load sample PDF document
                extractor.LoadDocumentFromFile(inputfile)

                Dim pageCount = extractor.GetPageCount()
                Dim currentPageTypeName = "UNKNOWN"
                Dim Path As String = IO.Path.GetFileNameWithoutExtension(inputfile)
                Dim extracted = Path.Substring(0, 7)
                ' Search each page for a keyword 

                For i = 0 To pageCount - 1

                    ' Find the type of the current page
                    ' If it is not present on the page, then the last one found will be used.
                    For Each pt In pageTypes
                        If extractor.Find(i, pt.Identifier, False) Then
                            currentPageTypeName = pt.TypeName
                        End If
                    Next


                    ' Extract page
                    Using splitter As New DocumentSplitter() With {.OptimizeSplittedDocuments = True}
                        Dim pageNumber = i + 1   ' (!) page number in ExtractPage() is 1-based

                        If Not Directory.Exists(dir & "\unmerged") Then
                            Directory.CreateDirectory(dir & "\unmerged")
                        End If

                        Dim outputfile = Combine(unmerged, extracted & currentPageTypeName & pageNumber & ".pdf")

                        splitter.ExtractPage(inputfile, outputfile, pageNumber)

                        Console.WriteLine("Extracted page " & pageNumber & " to file """ & outputfile & """")

                    End Using

                Next
                extractor.Dispose()

            Next ' for each 
        Next

        xlWorkBook.Close()
        xlApp.Quit()
        releaseObject(xlApp)
        releaseObject(xlWorkBook)
        releaseObject(xlWorkSheet)


        Call Xavier()
    End Sub


    Private Sub releaseObject(ByVal aCell As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(aCell)
            aCell = Nothing
        Catch ex As Exception
            aCell = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Module


Module Module2
    Private inputdir As String = "G:\Word\Department Folders\Pre-Suit\Drafts-IL\2-IL_AttyReview\2018-09\Reviewed\unmerged\"


    Public Sub Xavier()

        MergeFiles("Cover Sheet", inputdir)
        MergeFiles("Complaint", inputdir)
        MergeFiles("Exhibit", inputdir)
        MergeFiles("Military", inputdir)
        MergeFiles("Summons", inputdir)
    End Sub

    Public Sub MergeFiles(ByVal name As String, inputdir As String)
        Dim OutputFile As String
        Dim OutputDir As String = inputdir & "\Merge\"
        Dim OutputDocument As PdfDocument

        If Not Directory.Exists(OutputDir) Then Directory.CreateDirectory(OutputDir)

        For Each files As String In Directory.GetFiles(inputdir, "*" & name & "*.pdf")
            OutputFile = GetFileNameWithoutExtension(files).Substring(0, 7) & " " & name & ".pdf"

            If File.Exists(OutputDir & OutputFile) Then
                OutputDocument = PdfReader.Open(OutputDir & OutputFile)
            Else
                OutputDocument = New PdfDocument()
            End If
            Console.WriteLine("Merging: {0}...", GetFileName(files))
            Using InputDocument As PdfDocument = PdfReader.Open(files, PdfDocumentOpenMode.Import)
                For Each page As PdfPage In InputDocument.Pages
                    OutputDocument.AddPage(page)
                Next
            End Using

            OutputDocument.Save(OutputDir & OutputFile)
            OutputDocument.Dispose()
        Next

    End Sub
End Module
...