Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

Python

파이썬에서 Excel 데이터를 Word 표로 변환하는 2가지 방법

권현욱(엑셀러) 2024. 12. 18. 15:49
반응형

들어가기 전에

Excel은 데이터 관리와 계산에 널리 사용되는 반면, Word는 보고서를 비롯한 문서 작성에 장점이 있습니다. Excel 데이터를 Word 표로 변환하면 두 가지 도구의 장점을 결합할 수 있습니다. 파이썬을 사용하여 서식이 있는 Excel 데이터를 Word 표로 원활하게 변환하는 방법을 소개합니다.

권현욱(엑셀러) | 아이엑셀러 닷컴 대표 · Microsoft Excel MVP · Excel 솔루션 프로바이더 · 작가

이미지: 아이엑셀러 닷컴


이 글은 아래 기사 내용을 토대로 작성되었습니다만, 필자의 개인 의견이나 추가 자료들이 다수 포함되어 있습니다.

  • 원문: Convert Excel Data to Word Table with Formatting in Python (Step by Step Guide)
  • URL: https://medium.com/@alice.yang_10652/convert-excel-data-to-word-table-with-formatting-in-python-step-by-step-guide-6767da9b6aa9

Excel 데이터를 Word 표로 변환하는 Python 라이브러리

Excel 데이터를 Word 표로 변환하기 위해 두 가지 Python 라이브러리를 사용하겠습니다: Excel 파일 작업을 위한 Python용 Spire.XLS와 Word 파일 처리를 위한 Python용 Spire.Doc입니다. 다음 명령을 실행하여 파이썬용 Spire.XLS와 파이썬용 Spire.Doc을 설치할 수 있습니다.

 

pip install spire.xls spire.doc

 

이 글에서는 Excel 데이터를 Word 표로 변환하는 두 가지 방법을 소개합니다.

  1. Excel 데이터를 서식과 함께 Word 표로 가져오는 방법
  2. Excel 파일을 Word 문서에 OLE 개체로 삽입하는 방법

 

방법 1: Python에서 Excel 데이터를 서식과 함께 Word 표로 가져오기

Excel 데이터를 Word 표로 가져오고 서식을 지정하면 표의 모양을 완벽하게 제어할 수 있습니다. 이 방법을 사용하면 Excel에서 셀 값, 글꼴, 색상, 정렬 및 기타 스타일을 복사하여 최종 Word 표에 원래 서식이 유지되도록 할 수 있습니다. 필요에 따라 사용자 지정 서식을 적용할 수도 있습니다.

(1) Excel 파일 로드하기

먼저, 통합 문서 클래스의 LoadFromFile() 메서드를 사용하여 Excel 파일을 로드합니다. 그런 다음 전송하려는 데이터가 포함된 워크시트를 검색합니다.

 

workbook = Workbook()
workbook.LoadFromFile("Example.xlsx")
sheet = workbook.Worksheets[0]

 

(2) Word 문서 만들기 및 표 삽입하기

Document 클래스를 사용하여 새 Word 문서를 만듭니다. 그리고 Table 클래스의 ResetCells 메서드를 사용하여 Excel 워크시트와 동일한 수의 행과 열이 있는 표를 추가합니다.

 

doc = Document()
section = doc.AddSection()
section.PageSetup.Orientation = PageOrientation.Landscape
table = section.AddTable(True)
table.ResetCells(sheet.LastRow, sheet.LastColumn)

 

(3) Excel에서 병합된 셀 처리하기

Excel 워크시트에는 병합된 셀이 포함될 수 있으므로 적절하게 관리하는 것이 중요합니다. 이 부분의 로직을 메서드로 캡슐화했습니다.

 

merge_cells(sheet, table)

 

다음은 merge_cells 메서드의 구현입니다. 이 메서드에서는 워크시트 클래스의 HasMergedCells 속성을 통해 Excel 시트에 병합된 셀이 있는지 확인합니다. 병합된 셀이 발견되면 Table 클래스의 ApplyHorizongtalMerge 및 ApplyVerticalMerge 메서드를 통해 Word 테이블에서 해당 셀을 병합합니다.

 

def merge_cells(sheet, table):
    if sheet.HasMergedCells:
        # Get all merged cell ranges from the Excel worksheet
        ranges = sheet.MergedCells
        for merged_range in ranges:
            # Extract the starting row, column, and the number of rows and columns in the merged range
            start_row = merged_range.Row
            start_column = merged_range.Column
            row_count = merged_range.RowCount
            column_count = merged_range.ColumnCount

            # Apply both horizontal and vertical merging if multiple rows and columns are merged
            if row_count > 1 and column_count > 1:
                # Apply horizontal merging for each row within the merged range
                for j in range(start_row, start_row + row_count):
                    table.ApplyHorizontalMerge(j - 1, start_column - 1, start_column - 1 + column_count - 1)
                # Apply vertical merging across the merged rows
                table.ApplyVerticalMerge(start_column - 1, start_row - 1, start_row - 1 + row_count - 1)
            # Apply vertical merging for multi-row merged cells
            elif row_count > 1:
                table.ApplyVerticalMerge(start_column - 1, start_row - 1, start_row - 1 + row_count - 1)
            # Apply horizontal merging for multi-column merged cells
            elif column_count > 1:
                table.ApplyHorizontalMerge(start_row - 1, start_column - 1, start_column - 1 + column_count - 1)

 

(4) 워드 표를 Excel 데이터로 채우고 Excel 스타일을 워드 표에 복사

Excel 시트의 각 행과 열을 반복하여 Excel 셀의 데이터와 스타일을 Word 표로 복사합니다.

 

for r in range(1, sheet.LastRow + 1):
    # Set row height in the Word table to match the row height in the Excel sheet
    table.Rows[r - 1].Height = float(sheet.Rows[r - 1].RowHeight)

    for c in range(1, sheet.LastColumn + 1):
        # Get the Excel cell at the current row and column
        x_cell = sheet.Range[r, c]
        # Get the corresponding Word table cell
        w_cell = table.Rows[r - 1].Cells[c - 1]

        # Insert the text from the Excel cell into the Word table cell
        text_range = w_cell.AddParagraph().AppendText(x_cell.DisplayedText)

        # Copy the style (font, color, alignment, etc.) from the Excel cell to the Word cell
        copy_style(text_range, x_cell, w_cell)

 

다음은 copy_style 메서드의 구현입니다. 이 메서드에서는 글꼴 속성 및 스타일(배경색 및 정렬)을 Excel 셀에서 Word 표 셀로 복사합니다.

 

def copy_style(w_text_range, x_cell, w_cell):
    # Copy font formatting (text color, font size, name, and style) from Excel cell to Word text range
    w_text_range.CharacterFormat.TextColor = Color.FromRgb(x_cell.Style.Font.Color.R, x_cell.Style.Font.Color.G, x_cell.Style.Font.Color.B)
    w_text_range.CharacterFormat.FontSize = float(x_cell.Style.Font.Size)
    w_text_range.CharacterFormat.FontName = x_cell.Style.Font.FontName
    w_text_range.CharacterFormat.Bold = x_cell.Style.Font.IsBold
    w_text_range.CharacterFormat.Italic = x_cell.Style.Font.IsItalic

    # Copy background color from Excel cell to Word cell
    if x_cell.Style.FillPattern is not ExcelPatternType.none:
        w_cell.CellFormat.BackColor = Color.FromRgb(x_cell.Style.Color.R, x_cell.Style.Color.G, x_cell.Style.Color.B)

    # Copy horizontal alignment from Excel cell to Word paragraph
    if x_cell.HorizontalAlignment == HorizontalAlignType.Left:
        w_text_range.OwnerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Left
    elif x_cell.HorizontalAlignment == HorizontalAlignType.Center:
        w_text_range.OwnerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Center
    elif x_cell.HorizontalAlignment == HorizontalAlignType.Right:
        w_text_range.OwnerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Right

    # Copy vertical alignment from Excel cell to Word cell
    if x_cell.VerticalAlignment == VerticalAlignType.Bottom:
        w_cell.CellFormat.VerticalAlignment = VerticalAlignment.Bottom
    elif x_cell.VerticalAlignment == VerticalAlignType.Center:
        w_cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
    elif x_cell.VerticalAlignment == VerticalAlignType.Top:
        w_cell.CellFormat.VerticalAlignment = VerticalAlignment.Top

 

(5) 생성된 Word 문서 저장

마지막으로, Document 클래스의 SaveToFile 메서드를 사용하여 생성된 Word 문서를 저장합니다.

 

doc.SaveToFile("ExcelToWordTable.docx", FileFormat.Docx2016)

 

전체 코드는 다음과 같습니다.

 

from spire.xls import *
from spire.doc import *

# Function to apply cell merging from Excel sheet to Word table
# It checks if the Excel worksheet has merged cells, then merges the corresponding cells in the Word table.
def merge_cells(sheet, table):
    if sheet.HasMergedCells:
        # Get all merged cell ranges from the Excel worksheet
        ranges = sheet.MergedCells
        for merged_range in ranges:
            # Extract the starting row, column, and the number of rows and columns in the merged range
            start_row = merged_range.Row
            start_column = merged_range.Column
            row_count = merged_range.RowCount
            column_count = merged_range.ColumnCount

            # Apply both horizontal and vertical merging if multiple rows and columns are merged
            if row_count > 1 and column_count > 1:
                # Apply horizontal merging for each row within the merged range
                for j in range(start_row, start_row + row_count):
                    table.ApplyHorizontalMerge(j - 1, start_column - 1, start_column - 1 + column_count - 1)
                # Apply vertical merging across the merged rows
                table.ApplyVerticalMerge(start_column - 1, start_row - 1, start_row - 1 + row_count - 1)
            # Apply vertical merging for multi-row merged cells
            elif row_count > 1:
                table.ApplyVerticalMerge(start_column - 1, start_row - 1, start_row - 1 + row_count - 1)
            # Apply horizontal merging for multi-column merged cells
            elif column_count > 1:
                table.ApplyHorizontalMerge(start_row - 1, start_column - 1, start_column - 1 + column_count - 1)

# Function to copy formatting from Excel cells to Word table cells
# It replicates font properties, background color, and alignment (horizontal and vertical) from Excel to Word
def copy_style(w_text_range, x_cell, w_cell):
    # Copy font formatting (color, size, font name, bold, italic) from Excel cell to Word text range
    w_text_range.CharacterFormat.TextColor = Color.FromRgb(x_cell.Style.Font.Color.R, x_cell.Style.Font.Color.G, x_cell.Style.Font.Color.B)
    w_text_range.CharacterFormat.FontSize = float(x_cell.Style.Font.Size)
    w_text_range.CharacterFormat.FontName = x_cell.Style.Font.FontName
    w_text_range.CharacterFormat.Bold = x_cell.Style.Font.IsBold
    w_text_range.CharacterFormat.Italic = x_cell.Style.Font.IsItalic

    # Copy background color from Excel cell to Word cell
    if x_cell.Style.FillPattern is not ExcelPatternType.none:
        w_cell.CellFormat.BackColor = Color.FromRgb(x_cell.Style.Color.R, x_cell.Style.Color.G, x_cell.Style.Color.B)

    # Copy horizontal alignment from Excel cell to Word paragraph
    if x_cell.HorizontalAlignment == HorizontalAlignType.Left:
        w_text_range.OwnerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Left
    elif x_cell.HorizontalAlignment == HorizontalAlignType.Center:
        w_text_range.OwnerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Center
    elif x_cell.HorizontalAlignment == HorizontalAlignType.Right:
        w_text_range.OwnerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Right

    # Copy vertical alignment from Excel cell to Word cell
    if x_cell.VerticalAlignment == VerticalAlignType.Bottom:
        w_cell.CellFormat.VerticalAlignment = VerticalAlignment.Bottom
    elif x_cell.VerticalAlignment == VerticalAlignType.Center:
        w_cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
    elif x_cell.VerticalAlignment == VerticalAlignType.Top:
        w_cell.CellFormat.VerticalAlignment = VerticalAlignment.Top

# Load the Excel file into a Workbook object
workbook = Workbook()
workbook.LoadFromFile("Example.xlsx")

# Retrieve the first worksheet from the workbook
sheet = workbook.Worksheets[0]

doc = Document()
section = doc.AddSection()
section.PageSetup.Orientation = PageOrientation.Landscape

table = section.AddTable(True)
table.ResetCells(sheet.LastRow, sheet.LastColumn)
merge_cells(sheet, table)

for r in range(1, sheet.LastRow + 1):
    # Set row height in the Word table to match the row height in the Excel sheet
    table.Rows[r - 1].Height = float(sheet.Rows[r - 1].RowHeight)

    for c in range(1, sheet.LastColumn + 1):
        x_cell = sheet.Range[r, c]
        w_cell = table.Rows[r - 1].Cells[c - 1]
        text_range = w_cell.AddParagraph().AppendText(x_cell.DisplayedText)
        copy_style(text_range, x_cell, w_cell)

doc.SaveToFile("ExcelToWordTable.docx", FileFormat.Docx2016)
doc.Close()
workbook.Dispose()

 

방법 2:  Word에 Excel을 OLE 개체로 삽입하기

Excel 데이터를 OLE 개체로 Word에 삽입할 수도 있습니다. 이 방법은 전체 Excel 파일을 Word 문서에 삽입하여 기능을 유지하고 사용자가 삽입된 개체를 두 번 클릭하여 Excel 데이터를 열고 편집할 수 있도록 합니다.

(1) Excel 파일 로드하기

통합 문서 클래스의 LoadFromFile 메서드를 사용하여 Excel 파일을 로드합니다. 그런 다음 전송하려는 데이터가 포함된 워크시트를 검색합니다.

 

workbook = Workbook()
workbook.LoadFromFile("Example.xlsx")
sheet = workbook.Worksheets[0]

 

(2) 워크시트를 이미지로 변환하기
워크시트 클래스의 ToImage 메서드를 사용하여 워크시트를 이미지로 저장합니다. 그러면 이 이미지가 Word 문서에서 Excel OLE 개체의 아이콘으로 사용됩니다.

 

image = sheet.ToImage(1, 1, sheet.LastRow, sheet.LastColumn)
image.Save("ExcelIcon.png")

 

(3) Word 문서 만들기

Document 클래스를 사용하여 Word 문서를 만듭니다.

 

doc = Document()
section = doc.AddSection()  
section.PageSetup.Margins.All = 72.0
section.PageSetup.Orientation = PageOrientation.Landscape

 

(4) 변환된 이미지 로드

저장한 이미지를 DocPicture 객체에 로드합니다.

 

picture = DocPicture(doc)
picture.LoadImage("ExcelIcon.png")
picture.Width = 500.0  
picture.Height = 300.0

 

(5) Word 문서에 Excel 파일을 OLE로 삽입

Word 문서에 단락을 추가하고 로드된 이미지가 아이콘으로 있는 OLE 개체로 Excel 파일을 단락에 추가합니다.

 

para = section.AddParagraph()
para.AppendOleObject("Example.xlsx", picture, OleObjectType.ExcelWorksheet)

 

(6) Word 문서 저장

생성된 Word 문서를 Document 클래스의 SaveToFile 메서드를 사용하여 저장합니다.

 

doc.SaveToFile("InsertExcelIntoWordAsOLE.docx", FileFormat.Docx2013)

 

전체 코드는 다음과 같습니다.

 

from spire.xls import *
from spire.doc import *

# Load an Excel file into a Workbook object
workbook = Workbook()
workbook.LoadFromFile("Example.xlsx")

# Retrieve the first worksheet from the workbook
sheet = workbook.Worksheets[0]

# Set the worksheet margins to zero (optional, if not set, the image will have blank margins)
sheet.PageSetup.TopMargin = 0.0
sheet.PageSetup.BottomMargin = 0.0
sheet.PageSetup.LeftMargin = 0.0
sheet.PageSetup.RightMargin = 0.0

# Convert the worksheet to an image
# This image will be used as the icon for the Excel OLE object in the Word document
image = sheet.ToImage(1, 1, sheet.LastRow, sheet.LastColumn)
image.Save("ExcelIcon.png")

# Create a Word document
doc = Document()
# Add a section
section = doc.AddSection()  
# Set page margins
section.PageSetup.Margins.All = 72.0
# Set page orientation
section.PageSetup.Orientation = PageOrientation.Landscape  

# Load the previously saved image into a DocPicture object
picture = DocPicture(doc)
picture.LoadImage("ExcelIcon.png")
# Set the width and height of the image
picture.Width = 500.0  
picture.Height = 300.0

# Add a paragraph to the section
para = section.AddParagraph()
# Append the Excel file to the paragraph as an OLE object using the loaded image as an icon
para.AppendOleObject("Example.xlsx", picture, OleObjectType.ExcelWorksheet)

# Save the Word document with the embedded Excel OLE object
doc.SaveToFile("InsertExcelIntoWordAsOLE.docx", FileFormat.Docx2013)
doc.Close()
workbook.Dispose()

 

마치며

Python을 사용하여 서식을 유지하면서 Excel 데이터를 Word 데이터로 변환하는 두 가지 방법에 대해 소개했습니다. 자신의 상황에 적합한 것을 선택해서 사용하시기 바랍니다.