Eksportować arkusz kalkulacyjny Excel do pliku tekstowego o stałej szerokości?

24

Excel ma funkcję importowania plików tekstowych o stałej szerokości, w których wyświetla okno dialogowe, które pozwala wybrać, gdzie są początki i końce pól, które umieszcza w kolumnach.

Czy ma również funkcję, w której przy istniejącym arkuszu kalkulacyjnym można eksportować do pliku tekstowego o stałej szerokości?

Jeśli tak, jak mogę uzyskać do tego dostęp? Próbowałem użyć opcji Zapisz jako i wybrania pliku tekstowego, ale wydaje się, że zapisuje się tylko jako znak rozdzielany tabulatorami, co mi nie pomaga.

To Excel 2003, jeśli ma to znaczenie.

RationalGeek
źródło

Odpowiedzi:

24

Myślę, że najbliższą dostępną funkcją natywnego programu Excel jest Zapisz jako | Tekst sformatowany (rozdzielany spacjami) (* .prn) . Automatycznie określi szerokości i wstawi spacje do tej szerokości w razie potrzeby.

Poza tym musisz mieć makro lub inny dodatek, który pozwoli ci zrobić więcej.

squillman
źródło
3
Aby dodać trochę przejrzystości - „automatycznie” określi szerokości na podstawie szerokości określonej dla kolumn. Podczas gdy zwykle pomiary są zbliżone do ems (o ile pamiętam), podczas eksportowania do stałej szerokości prn są one brane dosłownie i zaokrąglane w dół, aby podać wartości całkowite używane dla liczby znaków w kolumnie pliku prn. Spacje są dodawane do wypełniania, w lewo lub w prawo, w zależności od wyrównania w komórkach (więc domyślnie liczby będą wstawiane po lewej, aby wymusić je w prawo, tekst po prawej, aby wymusić w lewo, ale jeśli zmieniłeś wyrównanie, będą one inny)
AdamV
Robi to, czego szukałem. Dzięki!
RationalGeek
1
Uwaga: sformatowany tekst (.prn) jest ograniczony do 240 znaków w wierszu w programie Excel support.microsoft.com/kb/249885
iokevins
Aby użyć makra wskazywanego przez iokevins, musisz usunąć „& delimiter” z dwóch miejsc, w których zdefiniowano CellText. W przeciwnym razie doda dodatkowe miejsce dla każdej komórki, czego nie robi zapisywanie jako prn.
farrenthorpe,
14

Jeśli masz pakiet Office Professional, możesz otworzyć plik Excel w programie Access, a następnie Eksportuj z programu Access. Access pozwoli ci określić układ stałej szerokości dla eksportowanego pliku i zapewni ci bardzo szczegółowe kontrolki do określania tych szerokości.

davidcl
źródło
Chociaż Access może to zrobić, podobnie Excel, o który został poproszony.
AdamV
7
Dzięki za recenzję, ale pomyślałem, że warto wspomnieć, że Access ma pełną wersję tej funkcji. Program Excel nie pozwala bezpośrednio określać szerokości kolumn, program Access obsługuje. Tak, możesz uzyskać odpowiednie szerokości kolumn w programie Excel, rozglądając się z szerokościami kolumn w arkuszu, ale jest to uciążliwe i jako ktoś, kto musi regularnie tworzyć pliki o stałej szerokości, nie warto tego robić. Jeśli masz dostęp (który ma wiele osób), istnieje o wiele lepszy sposób.
davidcl
Doskonały; dziękuję za tę alternatywę: o)
iokevins,
5

Wow, chciałem sam zadać to pytanie, ale zostało już zadane. Wszystkie dane wyjściowe ze schowka programu Excel są tabdomyślnie ograniczone. Jest to trochę denerwujące dla „prawdziwego” tekstu wyjściowego, gdy masz czcionkę o stałej szerokości, ale niekoniecznie obsługuje ogranicznik tabulatorów.

W każdym razie znalazłem i zmodyfikowałem małe makro Excela, które skopiuje aktualnie wybrany region jako prostą tabelę kolumn ASCII o stałej szerokości - tak:

187712 201 37 0,18   
2525 580 149 0,25   
136829 137 43 0,31   

Oto kod makra. Aby z niego skorzystać, należy włączyć kartę Deweloper w Opcjach programu Excel, jeśli używasz programu Excel 2007 lub nowszego.

Sub CopySelectionToClipboardAsText()

   ' requires a reference to "Windows Forms 2.0 Object Library"
   ' add it via Tools / References; if it does not appear in the list
   ' manually add it as the path C:\Windows\System32\FM20.dll

    Dim r As Long, c As Long
    Dim selectedrows As Integer, selectedcols As Integer

    Dim arr
    arr = ActiveSheet.UsedRange
    selectedrows = UBound(arr, 1)
    selectedcols = UBound(arr, 2)

    Dim temp As Integer
    Dim cellsize As Integer
    cellsize = 0
    For c = 1 To selectedcols
        temp = Len(CStr(Cells(1, c)))
        If temp > cellsize Then
            cellsize = temp
        End If
    Next c
    cellsize = cellsize + 1

    Dim line As String
    Dim output As String

    For r = 1 To selectedrows
        line = Space(selectedcols * cellsize)
        For c = 1 To selectedcols
            Mid(line, c * cellsize - cellsize + 1, cellsize) = Cells(r, c)
        Next c
        output = output + line + Chr(13) + Chr(10)
    Next r

    Dim MyData As MSForms.DataObject
    Set MyData = New DataObject
    MyData.SetText output
    MyData.PutInClipboard

    MsgBox "The current selection was formatted and copied to the clipboard"

End Sub
Jeff Atwood
źródło
4

Najpierw sformatuj dane jako Courier New (lub inną czcionkę o stałej szerokości). Następnie zapisz jako .prn, a otrzymasz prawdziwą stałą szerokość.

dkusleika
źródło
To zadziałało dla mnie świetnie. Lubię też formatować wszystko jako tekst, zanim to zrobię. W ten sposób wszystkie dane zostają wyrównane po zapisaniu.
Gary Brunton
2

Rozwijając odpowiedź Jeffa Atwooda, ponieważ nie pozwoliłbym jej tam skomentować:

Zmodyfikowałem jego makro, aby ustawić szerokość kolumny na najszerszą komórkę w tej kolumnie i aby każda kolumna miała własną szerokość. Jego makro znalazło tylko najszerszą komórkę w pierwszym rzędzie, a następnie ustawiło do niej szerokość wszystkich kolumn.

Sub CopySelectionToClipboardAsText()

   ' requires a reference to "Windows Forms 2.0 Object Library"
   ' add it via Tools / References; if it does not appear in the list
   ' manually add it as the path C:\Windows\System32\FM20.dll

    Dim r As Long, c As Long, linesize As Long
    Dim selectedrows As Integer, selectedcols As Integer

    Dim arr
    arr = ActiveSheet.UsedRange
    selectedrows = UBound(arr, 1)
    selectedcols = UBound(arr, 2)
    ReDim CellSizes(1 To selectedcols, 2) As Integer

    Dim temp As Integer
    Dim cellsize As Integer
    linesize = 0
    For c = 1 To selectedcols
        cellsize = 0
        For r = 1 To selectedrows
            temp = Len(CStr(Cells(r, c)))
            If temp > cellsize Then
                cellsize = temp
            End If
        Next
        CellSizes(c, 0) = cellsize + 1
        CellSizes(c, 1) = linesize
        linesize = linesize + cellsize + 1
    Next c

    Dim line As String
    Dim output As String

    For r = 1 To selectedrows
        line = Space(linesize)
        For c = 1 To selectedcols
            Mid(line, CellSizes(c, 1) + 1, CellSizes(c, 0)) = Cells(r, c)
        Next c
        output = output + line + Chr(13) + Chr(10)
    Next r

    Dim MyData As MSForms.DataObject
    Set MyData = New DataObject
    MyData.SetText output
    MyData.PutInClipboard

    MsgBox "The current selection was formatted and copied to the clipboard"

End Sub
Piotr
źródło
0

To jest dla mnie zabójca. Ma również kilka opcji.

http://www.sensefulsolutions.com/2010/10/format-text-as-table.html

sancho.s Przywróć Monikę
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Ramhound,
2
@Ramhound - ogólnie się zgadzam. Ale w tym przypadku nie mogę tu nic skopiować. Ta strona internetowa jest miejscem, w którym wklejasz dane wejściowe i otrzymujesz dane wyjściowe w formacie Excel. Jeśli link straci ważność, usługa zniknie.
sancho.s Przywróć Monikę
Usługa została przeniesiona: senseful.github.io/web-tools/text-table , a źródło jest dostępne: github.com/senseful/web-tools
ngm
Który ponownie przeniósł się na: senseful.github.io/text-table
Chris
0

Działa z Access po wyjęciu z pudełka: https://support.office.com/en-ie/article/export-data-to-a-text-file-f72dfc38-a8a0-4c5b-8c2c-bf2950814140#bmsteps z tym sposób, w jaki zarządzałem, jest dość łatwy i szybki - lepszy niż w programie Excel. W moim przypadku była to konwersja tabeli.

Alex
źródło
Wygląda na to, że umieściłeś odpowiedź na niewłaściwe pytanie ;-) To pytanie dotyczy programu Excel, a Twoja odpowiedź dotyczy programu Access. Również w przypadku przyszłych odpowiedzi: Podanie linku w celach informacyjnych jest użyteczne, ale musisz również podać istotne informacje w poście.
robinCTS