---
title: pandas read_excel — อ่านไฟล์ Excel เข้า pandas DataFrame
url: https://www.thepexcel.com/functions/python/io/pandas-read-excel/
type: function-explainer
program: Python
syntax: "pd.read_excel(io, sheet_name, usecols, header)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas read_excel — อ่านไฟล์ Excel เข้า pandas DataFrame

> read_excel ใน pandas ผมใช้สำหรับโหลดข้อมูลจากไฟล์ .xlsx หรือ .xls เข้ามาเป็น DataFrame เพื่อวิเคราะห

## คำอธิบาย

read_excel ใน pandas ผมใช้สำหรับโหลดข้อมูลจากไฟล์ .xlsx หรือ .xls เข้ามาเป็น DataFrame เพื่อวิเคราะห์ต่อใน Python ถ้าเคยเปิดไฟล์ Excel แล้วก็อปข้อมูลไปทำงานต่อ ตัวนี้ทำแบบเดียวกันแต่อัตโนมัติเลยครับ

## Syntax

```excel
pd.read_excel(io, sheet_name, usecols, header)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| io | Yes | str \| Path \| BytesIO |  | path ของไฟล์ Excel หรือ object ที่อ่านได้ เช่น 'data.xlsx', Path('data.xlsx'), หรือ BytesIO buffer |
| sheet_name | No | str \| int \| list \| None | 0 | ชื่อหรือ index ของ sheet ที่จะอ่าน ค่า default คือ 0 (sheet แรก) ถ้าใส่ None จะอ่านทุก sheet และคืน dict |
| usecols | No | str \| list \| callable \| None | None | เลือกเฉพาะบางคอลัมน์ เช่น 'A:C' สำหรับ Excel column letter, ['name','age'] สำหรับชื่อคอลัมน์, หรือ None เพื่ออ่านทุกคอลัมน์ |
| header | No | int \| list \| None | 0 | แถวที่ใช้เป็น header (ชื่อคอลัมน์) ค่า default คือ 0 (แถวแรก) ถ้าใส่ None จะไม่มี header และคอลัมน์จะเป็นตัวเลข 0, 1, 2... |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: อ่านไฟล์ Excel พื้นฐาน

```excel
pd.read_excel(buf)
```

**ผลลัพธ์:** `  name  age
0  Ann   30
1  Bob   25`

ผมอ่านไฟล์ Excel เข้ามาเป็น DataFrame ด้วยคำสั่งเดียวครับ แถวแรกของ Excel จะกลายเป็นชื่อคอลัมน์อัตโนมัติ ในงานจริงแค่แทน buf ด้วย path ไฟล์ เช่น pd.read_excel('sales_2024.xlsx') ก็ใช้งานได้เลย

### 2. ตัวอย่างที่ 2: เลือก sheet และคอลัมน์ที่ต้องการ

```excel
pd.read_excel(buf, sheet_name='employees', usecols=['name', 'age'])
```

**ผลลัพธ์:** `  name  age
0  Ann   30
1  Bob   25`

ผมระบุชื่อ sheet ว่า 'employees' และเลือกเฉพาะคอลัมน์ name กับ age มาเท่านั้นครับ ถ้าไฟล์มีหลาย sheet วิธีนี้สะดวกมาก ไม่ต้องโหลดข้อมูลทั้งหมดให้หนักโดยไม่จำเป็น

### 3. ตัวอย่างที่ 3: อ่านโดยไม่มี header (ข้อมูลดิบไม่มีชื่อคอลัมน์)

```excel
pd.read_excel(buf, header=None)
```

**ผลลัพธ์:** `     0   1
0  Ann  30
1  Bob  25`

บางครั้งผมเจอไฟล์ Excel ที่แถวแรกไม่ใช่ชื่อคอลัมน์ แต่เป็นข้อมูลจริงๆ เลยครับ ใส่ header=None ไว้ pandas จะตั้งชื่อคอลัมน์เป็นตัวเลข 0, 1, 2... แทน แล้วค่อยเปลี่ยนชื่อทีหลังด้วย df.columns = ['name', 'age'] ได้

### 4. ตัวอย่างที่ 4: อ่านทุก sheet พร้อมกันได้ dict

```excel
pd.read_excel(buf, sheet_name=None)
```

**ผลลัพธ์:** `{'Jan':   name  age
0  Ann   30, 'Feb':   name  age
0  Bob   25}`

ใส่ sheet_name=None แล้วจะได้ dict กลับมา key คือชื่อ sheet value คือ DataFrame ของแต่ละ sheet ครับ ผมใช้วิธีนี้ตอนไฟล์มีข้อมูลแยกรายเดือนไว้ใน sheet ต่างๆ แล้วอยากรวมทุก sheet เข้าด้วยกัน

## หมายเหตุเพิ่มเติม

- 💡 ผมแนะนำให้ใส่ index=False ตอน to_excel เสมอครับ ไม่งั้นผลที่ออกมาจะมีคอลัมน์ index เลขโผล่มาโดยไม่จำเป็น แล้วตอน read_excel กลับมาจะได้คอลัมน์ Unnamed: 0 มาให้งงอีกรอบ

- ถ้าไฟล์ใหญ่และต้องการแค่บางคอลัมน์ ผมแนะนำให้ใช้ usecols ระบุเฉพาะคอลัมน์ที่ต้องการตั้งแต่ตอนอ่านเลยครับ ดีกว่าโหลดทั้งหมดมาแล้วค่อย drop — ทั้งเร็วกว่าและใช้ RAM น้อยกว่า

## คำถามที่พบบ่อย

**Q: ต้องติดตั้งอะไรเพิ่มเติมไหมก่อนใช้ read_excel?**

ต้องติดตั้ง openpyxl ด้วยครับ เพราะ pandas ใช้มันเป็น engine อ่านไฟล์ .xlsx ถ้าไม่มีจะขึ้น error ว่า 'Missing optional dependency openpyxl' ติดตั้งด้วย pip install openpyxl แค่ครั้งเดียวก็ใช้ได้เลย ส่วนไฟล์ .xls เก่าๆ ต้องใช้ engine='xlrd' แทนครับ

**Q: ถ้าอยากส่งออกผลลัพธ์กลับเป็นไฟล์ Excel ต้องทำยังไง?**

ใช้ df.to_excel('output.xlsx', index=False) ครับ มันคือคู่หูของ read_excel เลย — อ่านเข้ามาด้วย read_excel แปรรูปข้อมูล แล้วบันทึกออกด้วย to_excel ผมใช้สองตัวนี้คู่กันตลอดเลยตอนทำ Excel automation

**Q: อ่านไฟล์ที่มีหลาย header (merged cells บน 2 แถว) ได้ไหม?**

ได้ครับ ใส่ header=[0,1] เพื่อบอกให้ pandas ใช้แถว 0 และ 1 เป็น header ร่วมกัน ผลลัพธ์จะได้เป็น MultiIndex columns ซึ่งอ่านยากหน่อยแต่ทำได้ครับ ผมแนะนำให้ flatten ออกก่อนด้วย df.columns = ['_'.join(col) for col in df.columns] เพื่อให้ง่ายต่อการใช้งานต่อ

## แหล่งข้อมูลเพิ่มเติม

- [pandas read_excel (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/io/pandas-read-excel/](https://www.thepexcel.com/functions/python/io/pandas-read-excel/)_
