파이썬으로 엑셀 파일을 읽어서 매출 데이터를 분석하는 프로그램을 만들어주세요.
요구사항:
1. examples/data/sales/sales_data.xlsx 파일에서 'sales_data' 시트를 읽어옵니다
2. 데이터 처리:
   - '일자' 컬럼을 datetime으로 변환
   - '년월' 컬럼 추가 (YYYY-MM 형식의 문자열)
   - '금액', '수량', '단가' 컬럼을 숫자형으로 변환
3. 분석:
   - 월별 매출: '년월' 기준으로 '금액' 합계 계산
   - 제품별 매출: '제품' 기준으로 '금액'과 '수량' 합계 계산
4. 시각화:
   - 반드시 matplotlib.pyplot을 plt로 임포트
   - 반드시 matplotlib.ticker를 ticker로 임포트
   - 반드시 utils.create_matplotlib() 함수를 사용하여 모든 그래프 생성
   - utils.save_plot 함수를 사용하여 각 그래프 저장
   
   a) 월별 매출 추이 그래프:
      - create_matplotlib() 사용
      - '년월'을 x축, '금액'을 y축으로 사용
      - y축의 금액은 ax.add_formatter()를 사용하여 1,000,000 단위로 표시
      - 선 그래프로 표시
   
   b) 제품별 매출 비중 파이 차트:
      - create_matplotlib() 사용
      - 각 제품의 전체 매출 대비 비중을 %로 표시
      - 각 제품별로 다른 색상 사용
      - 범례 표시
   
   c) 제품별 월별 매출 추이:
      - create_matplotlib() 사용
      - x축은 '년월'
      - y축은 '금액'
      - 각 제품별로 다른 색상의 선으로 표시
      - 범례 표시
   
   d) 제품별 판매 수량 막대 그래프:
      - create_matplotlib() 사용
      - x축은 '제품'
      - y축은 '수량'
      - 각 제품별로 다른 색상 사용
      - 수량 레이블 표시

5. PDF 보고서 생성:
   - utils.PDFDocument 클래스를 사용하여 PDF 문서 생성
   - output/sales_analysis_report.pdf 파일로 저장
   - PDFDocument 객체 생성 후 add_page() 호출하지 않음 (첫 페이지는 자동 생성됨)
   - DataFrame을 테이블로 추가할 때는 반드시 values.tolist() 메서드를 사용하여 리스트로 변환
   - 테이블 헤더는 DataFrame의 columns.tolist()를 사용
   예시:
   ```python
   # DataFrame을 테이블로 추가할 때
   data_list = df[['컬럼1', '컬럼2']].values.tolist()
   headers = df[['컬럼1', '컬럼2']].columns.tolist()
   doc.add_table(data=data_list, header=headers)
   ```
   - 포함 내용:
     * 전체 매출 요약 (금액은 '1,000,000' 형식으로 표시)
     * 월별 매출 추이 그래프
     * 제품별 매출 비중 파이 차트
     * 제품별 월별 매출 추이 그래프
     * 제품별 판매 수량 막대 그래프
     * 제품별 매출 비중 (금액은 '1,000,000' 형식으로 표시)
     * 제품별 판매 수량
   - 문서 생성 순서:
     1. PDFDocument 객체 생성 (add_page() 호출하지 않음)
     2. add_heading()로 제목 추가
     3. 나머지 내용 순차적으로 추가
     4. save()로 저장

6. HWP 보고서 생성:
   - utils.HWPDocument 클래스를 사용하여 HWP 문서 생성
   - output/sales_analysis_report.hwpx 파일로 저장
   - DataFrame을 테이블로 추가할 때는 반드시 values.tolist() 메서드를 사용하여 리스트로 변환
   - 테이블 헤더는 DataFrame의 columns.tolist()를 사용
   예시:
   ```python
   # DataFrame을 테이블로 추가할 때
   data_list = df[['컬럼1', '컬럼2']].values.tolist()
   headers = df[['컬럼1', '컬럼2']].columns.tolist()
   doc.add_table(data=data_list, header=headers)
   ```
   - 포함 내용은 PDF와 동일:
     * 전체 매출 요약 (금액은 '1,000,000' 형식으로 표시)
     * 월별 매출 추이 그래프 (add_image 사용)
     * 제품별 매출 비중 파이 차트 (add_image 사용)
     * 제품별 월별 매출 추이 그래프 (add_image 사용)
     * 제품별 판매 수량 막대 그래프 (add_image 사용)
     * 제품별 매출 비중 (add_table 사용)
     * 제품별 판매 수량 (add_table 사용)
   - 문서 생성 순서:
     1. HWPDocument 객체 생성
     2. add_heading()으로 제목 추가 (필수)
     3. add_paragraph()로 전체 매출 요약 추가
     4. add_image()로 각 그래프 이미지 추가
     5. add_table()로 제품별 매출 및 수량 데이터 추가
     6. save()로 저장 (반드시 .hwpx 형식으로 저장)

7. 숫자 표시 형식:
   - 모든 금액은 3자리 컴마가 있는 정수로 표시 (예: 1,234,567)
   - 수량은 정수로 표시

참고: 데이터 파일의 컬럼 구조는 다음과 같습니다:
- 일자: 날짜
- 제품: 제품명
- 수량: 판매 수량
- 단가: 제품 단가
- 금액: 매출 금액

8. 완성된 보고서를 chaeya@gmail.com으로 자동 발송합니다
   - utils.send_email 함수를 사용하여 이메일 발송
   - 예시:
   ```python
   send_email(
       to_email="chaeya@gmail.com",
       subject="매출 분석 보고서",
       body="매출 분석 보고서를 첨부합니다.",
       attachments=[pdf_path, hwp_path]
   )
   ```
   - 첨부파일은 PDF와 HWP 보고서 모두 포함
   - 실패 시 에러 메시지 출력