# 與工作簿建立聯繫

## 用 Python 操作 Excel

The easiest way to connect to a book is offered by `xw.Book`: it looks for the book in all app instances and
returns an error, should the same book be open in multiple instances.
To connect to a book in the active app instance, use `xw.books` and to refer to a specific app, use:

```pycon
>>> app = xw.App()  # or something like xw.apps[10559] for existing apps, get the available PIDs via xw.apps.keys()
>>> app.books['Book1']
```

Note that you usually should use `App` as a context manager as this will make sure that the Excel instance is closed and cleaned up again properly:

```python
with xw.App() as app:
    book = app.books['Book1']
```

|            | xw.Book                            | xw.books                                 |
|------------|------------------------------------|------------------------------------------|
| 新工作簿       | `xw.Book()`                        | `xw.books.add()`                         |
| 尚未儲存的工作簿   | `xw.Book('Book1')`                 | `xw.books['Book1']`                      |
| 根據路徑開啓的工作簿 | `xw.Book(r'C:/path/to/file.xlsx')` | `xw.books.open(r'C:/path/to/file.xlsx')` |

#### NOTE
When specifying file paths on Windows, you should either use raw strings by putting
an `r` in front of the string or use double back-slashes like so: `C:\\path\\to\\file.xlsx`.

## 用 Excel 操作 Python (RunPython)

To reference the calling book when using `RunPython` in VBA, use `xw.Book.caller()`, see
[Call Python with "RunPython"](vba.md#call-python-with-runpython).
Check out the section about [Debugging](debugging.md#debugging) to see how you can call a script from both sides, Python and Excel, without
the need to constantly change between `xw.Book.caller()` and one of the methods explained above.

## 使用者自定函數（UDFs）

Unlike `RunPython`, UDFs don't need a call to `xw.Book.caller()`, see [User Defined Functions (UDFs)](udfs.md#user-defined-functions-udfs).
You'll usually use the `caller` argument which returns the xlwings range object from where you call the function.
