feat: improve format

This commit is contained in:
insleker 2026-01-19 12:41:06 +08:00
parent 69c955fd57
commit 0db7c83733
14 changed files with 171 additions and 1440 deletions

View File

@ -295,6 +295,7 @@ print(summary_data)
- Column structure
- Separator rows between projects
- Appropriate column widths
- **Template colors and styles**: When a template file is provided, all cell colors, fonts, borders, and other styling from the template's first 4 rows (headers) are automatically preserved in the output
6. **Multiple Team Members**: When multiple people work on the same project, their names are combined in the "參與人員" column and hours are summed.

View File

@ -8,9 +8,98 @@ import pandas as pd
import openpyxl
from datetime import datetime
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from copy import copy
import os
# Style constants for consistent coloring
HEADER_FILL_COLOR = 'FF2F75B5' # Blue header background
DATA_FILL_COLOR = 'FFE7E6E6' # Light gray data background
WHITE_BORDER = Border(
left=Side(style='thin', color='FFFFFFFF'),
right=Side(style='thin', color='FFFFFFFF'),
top=Side(style='thin', color='FFFFFFFF'),
bottom=Side(style='thin', color='FFFFFFFF')
)
def copy_cell_style(source_cell, target_cell):
"""
Copy all styling from source cell to target cell.
"""
if source_cell.has_style:
target_cell.font = copy(source_cell.font)
target_cell.border = copy(source_cell.border)
target_cell.fill = copy(source_cell.fill)
target_cell.number_format = copy(source_cell.number_format)
target_cell.protection = copy(source_cell.protection)
target_cell.alignment = copy(source_cell.alignment)
def copy_sheet_with_format(source_sheet, target_sheet, max_rows=10):
"""
Copy formatting from source sheet template to target sheet.
Only copies the first few rows (headers) to preserve template styling.
"""
# Copy row heights
for row_idx in range(1, max_rows + 1):
if row_idx in source_sheet.row_dimensions:
target_sheet.row_dimensions[row_idx].height = source_sheet.row_dimensions[row_idx].height
# Copy column widths
for col_letter in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']:
if col_letter in source_sheet.column_dimensions:
target_sheet.column_dimensions[col_letter].width = source_sheet.column_dimensions[col_letter].width
# Copy cell formatting for header rows (first max_rows)
for row_idx in range(1, max_rows + 1):
for col_idx in range(1, 12): # Columns A-K
source_cell = source_sheet.cell(row=row_idx, column=col_idx)
target_cell = target_sheet.cell(row=row_idx, column=col_idx)
# Copy style
copy_cell_style(source_cell, target_cell)
# Copy merged cells info (we'll handle merging separately)
# Copy merged cells from template (only header rows)
for merged_range in source_sheet.merged_cells.ranges:
if merged_range.min_row <= max_rows and merged_range.max_row <= max_rows:
try:
target_sheet.merge_cells(str(merged_range))
except:
pass # Skip if already merged or invalid
def style_header_row(ws, row_idx, template_cell=None, col_start=2, col_end=10):
"""
Apply header styling (blue fill, bold, centered, white grid) to a row.
If template_cell is provided, its style is copied before applying borders.
"""
for col_idx in range(col_start, col_end + 1):
cell = ws.cell(row=row_idx, column=col_idx)
if template_cell and template_cell.has_style:
copy_cell_style(template_cell, cell)
else:
cell.fill = PatternFill(start_color=HEADER_FILL_COLOR, end_color=HEADER_FILL_COLOR, fill_type='solid')
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
cell.border = WHITE_BORDER
def style_data_row(ws, row_idx, fill_color=DATA_FILL_COLOR, col_start=2, col_end=10):
"""
Apply data row styling (fill, wrap text, white grid) to a row.
"""
data_fill = PatternFill(start_color=fill_color, end_color=fill_color, fill_type='solid')
data_align = Alignment(vertical='top', wrap_text=True)
for col_idx in range(col_start, col_end + 1):
cell = ws.cell(row=row_idx, column=col_idx)
cell.fill = data_fill
cell.alignment = data_align
cell.border = WHITE_BORDER
def read_cost_report(file_path):
"""
Read cost report and parse the data.
@ -150,15 +239,39 @@ def generate_weekly_report(input_file, output_file, template_file=None, team_nam
if template_file and os.path.exists(template_file):
print(f"Loading template from: {template_file}")
wb = openpyxl.load_workbook(template_file)
# Get the template sheet (usually the first or named '周报示例')
template_sheet = None
for sheet_name_candidate in ['周报示例', wb.sheetnames[0]]:
if sheet_name_candidate in wb.sheetnames:
template_sheet = wb[sheet_name_candidate]
break
# Create new sheet for this week
sheet_name = f"{end_date.strftime('%Y%m%d')}-{team_name}"
ws = wb.create_sheet(sheet_name, 0) # Insert at beginning
# Copy formatting from template if available
if template_sheet:
print(f"Copying formatting from template sheet: {template_sheet.title}")
copy_sheet_with_format(template_sheet, ws, max_rows=4)
# Unmerge cells beyond row 4 to allow data writing
# Keep header merges (rows 1-3) but clear any others
merged_ranges_to_remove = []
for merged_range in ws.merged_cells.ranges:
if merged_range.min_row > 4:
merged_ranges_to_remove.append(merged_range)
for merged_range in merged_ranges_to_remove:
ws.unmerge_cells(str(merged_range))
else:
print("Creating new workbook (no template provided)")
wb = openpyxl.Workbook()
ws = wb.active
sheet_name = f"{end_date.strftime('%Y%m%d')}-{team_name}"
ws.title = sheet_name
template_sheet = None
# Write header
ws['B1'] = '弘訊科技股份有限公司'
@ -171,6 +284,10 @@ def generate_weekly_report(input_file, output_file, template_file=None, team_nam
for col_idx, header in enumerate(headers, start=2): # Start from column B
ws.cell(row=4, column=col_idx, value=header)
# Ensure header row is uniformly blue (including the 下周計畫 column)
template_header_cell = template_sheet.cell(row=4, column=2) if 'template_sheet' in locals() and template_sheet else None
style_header_row(ws, row_idx=4, template_cell=template_header_cell)
# Write data starting from row 5
current_row = 5
for idx, row_data in report_df.iterrows():
@ -183,45 +300,36 @@ def generate_weekly_report(input_file, output_file, template_file=None, team_nam
ws.cell(row=current_row, column=8, value=row_data['交付物'])
ws.cell(row=current_row, column=9, value=row_data['代碼上傳'])
ws.cell(row=current_row, column=10, value=row_data['下周計畫'])
# Apply consistent gray fill and white borders to data row
style_data_row(ws, row_idx=current_row)
current_row += 1
# Add separator row (except after last entry)
if idx < len(report_df) - 1:
current_row += 1
ws.cell(row=current_row, column=2, value='專案名稱')
for col_idx, header in enumerate(headers[1:], start=3):
ws.cell(row=current_row, column=col_idx, value=header)
# Apply blue header styling to separator row (no blank white spacer)
style_header_row(ws, row_idx=current_row, template_cell=template_header_cell)
current_row += 1
# Apply formatting
header_fill = PatternFill(start_color='D3D3D3', end_color='D3D3D3', fill_type='solid')
bold_font = Font(bold=True)
center_align = Alignment(horizontal='center', vertical='center', wrap_text=True)
wrap_align = Alignment(vertical='top', wrap_text=True)
# Apply formatting (only if no template was used)
if not template_sheet:
# Format title rows
ws['B1'].font = Font(bold=True, size=14)
ws['B1'].alignment = center_align
ws['B1'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
ws['B2'].font = Font(bold=True, size=12)
ws['B2'].alignment = center_align
ws['B2'].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
ws['B3'].font = Font(size=10, italic=True)
ws['B3'].alignment = wrap_align
ws['B3'].alignment = Alignment(vertical='top', wrap_text=True)
# Merge cells for headers
ws.merge_cells('B1:J1')
ws.merge_cells('B2:J2')
ws.merge_cells('B3:J3')
# Format column headers and separator rows
for row in range(1, current_row + 1):
cell_b = ws.cell(row=row, column=2)
if cell_b.value == '專案名稱' or row == 4:
for col_idx in range(2, 11):
cell = ws.cell(row=row, column=col_idx)
cell.fill = header_fill
cell.font = bold_font
cell.alignment = center_align
# Set column widths
column_widths = {
'B': 20, # 專案名稱
@ -237,8 +345,22 @@ def generate_weekly_report(input_file, output_file, template_file=None, team_nam
for col, width in column_widths.items():
ws.column_dimensions[col].width = width
else:
# Template was used - only apply formatting to separator rows and data cells
# Get header formatting from row 4
header_cells = [ws.cell(row=4, column=col_idx) for col_idx in range(2, 11)]
# Apply header formatting to separator rows
for row in range(5, current_row + 1):
cell_b = ws.cell(row=row, column=2)
if cell_b.value == '專案名稱':
for col_idx in range(2, 11):
target_cell = ws.cell(row=row, column=col_idx)
source_cell = ws.cell(row=4, column=col_idx)
copy_cell_style(source_cell, target_cell)
# Apply wrap text to all data cells
wrap_align = Alignment(vertical='top', wrap_text=True)
for row in range(5, current_row):
for col in range(2, 11):
ws.cell(row=row, column=col).alignment = wrap_align

3
.gitignore vendored
View File

@ -161,3 +161,6 @@ cython_debug/
#.idea/
uv.lock
temp/
output/
logs/

166
README.md
View File

@ -8,30 +8,6 @@ This repository contains AI skills for automated report generation. Currently in
Automatically generates weekly project reports (項目週報) from exported Excel time tracking data.
**Features:**
- Reads cost report Excel exports from project management systems
- Aggregates work hours by person and project
- Generates formatted weekly reports following company templates
- Auto-populates team members, work hours, and progress notes
- Creates professional Excel output with proper formatting
**Use Cases:**
- Weekly project status reporting
- Time tracking data transformation
- Team productivity summaries
- Management reporting automation
**Quick Start:**
```bash
cd skills/week_report_gen
python generate_report.py
```
**Documentation:**
- [SKILL.md](skills/week_report_gen/SKILL.md) - Comprehensive skill documentation
- [README.md](skills/week_report_gen/README.md) - Usage guide and examples
- [QUICK_REFERENCE.md](skills/week_report_gen/QUICK_REFERENCE.md) - AI assistant reference
## Getting Started
### Prerequisites
@ -39,146 +15,4 @@ python generate_report.py
```bash
# Create virtual environment and install dependencies
uv sync
# Activate virtual environment (optional - uv run handles this)
.venv\Scripts\activate # Windows
source .venv/bin/activate # Linux/Mac
```
> **💡 Tip**: This project uses `pyproject.toml` for reliable dependency management with uv.
> See [UV_SETUP_GUIDE.md](UV_SETUP_GUIDE.md) for detailed setup instructions and best practices.
### Using with AI Assistants
Simply tell your AI assistant (GitHub Copilot, Claude, etc.):
> "Generate a weekly report from the cost report file"
The AI will automatically:
1. Read the skill documentation
2. Process the input data
3. Generate a formatted report
4. Show you a summary
### Manual Usage
```python
from skills.week_report_gen.generate_report import generate_weekly_report
# Generate report
output_file, summary = generate_weekly_report(
input_file='path/to/cost-report.xls',
output_file='path/to/weekly-report.xlsx'
)
print(f"Report saved: {output_file}")
```
## Repository Structure
```
report_skill_expm/
├── README.md # This file
├── skills/
│ └── week_report_gen/ # Weekly report generator skill
│ ├── SKILL.md # Skill documentation
│ ├── README.md # User guide
│ ├── QUICK_REFERENCE.md # AI assistant reference
│ ├── generate_report.py # Main script
│ └── references/ # Sample files and templates
│ ├── cost-report-*.xls # Example input
│ ├── 項目週報-模板.xlsx # Standard template
│ └── 項目週報-*.xlsx # Example outputs
└── .venv/ # Virtual environment (created)
```
## Input & Output Examples
### Input: Cost Report
```
日期 使用者 活動 專案 單位
2026-01-12 ben sung Development masterXXX 8
2026-01-12 Ryan Hsueh - AXEL PLC 8
2026-01-13 傑 羅 Development CNC Library 移植 4
```
### Output: Weekly Report
```
弘訊科技股份有限公司
2026年度週報(01月12日-01月16日
專案名稱 參與人員 工時 本周主要進展
──────────────────────────────────────────────────
AXEL PLC Ryan Hsueh 48.0 -
masterXXX ben sung 15.0 Development
migrate to entry based sdo queue
CNC Library移植 傑 羅 8.0 Development
程式碼整理及重構
```
## Development
### Adding New Skills
1. Create a new directory under `skills/`
2. Add a `SKILL.md` file with comprehensive documentation
3. Implement the skill functionality
4. Add examples and tests
5. Update this README
### Testing
```bash
# Test the weekly report generator
cd skills/week_report_gen
python generate_report.py
```
## Use Cases
### 1. Weekly Team Reports
Transform time tracking exports into management-ready weekly reports automatically.
### 2. Project Status Updates
Quickly see which projects are active, who's working on them, and how many hours were invested.
### 3. Resource Allocation Analysis
Understand how team members' time is distributed across projects.
### 4. Management Reporting
Generate standardized reports for management review with minimal manual effort.
## Roadmap
Future skills being considered:
- **Monthly Summary Generator**: Aggregate weekly reports into monthly summaries
- **Project Timeline Generator**: Visualize project progress over time
- **Resource Utilization Report**: Analyze team member utilization rates
- **Cost Analysis Report**: Transform time data into cost estimates
- **Multi-team Comparison**: Compare metrics across different teams
## Contributing
Contributions welcome! To add a new skill:
1. Follow the existing skill structure
2. Provide comprehensive documentation
3. Include example files
4. Test thoroughly
5. Submit a pull request
## License
MIT License - See individual skill files for specific licensing information.
## Support
For questions or issues:
1. Check the skill-specific documentation in `skills/[skill_name]/`
2. Review example files in `references/` directories
3. Open an issue for bugs or feature requests
## Acknowledgments
This project demonstrates how AI skills can automate routine reporting tasks, saving time and reducing errors in data transformation and report generation workflows.

View File

@ -1,292 +0,0 @@
# Quick Start Guide for UV-based Setup
## Why UV + pyproject.toml?
**Reliable**: All dependencies locked to specific versions
**Fast**: UV is significantly faster than pip
**Reproducible**: Same environment across all machines
**Simple**: One command to set up everything
**Modern**: Using Python packaging best practices
## Installation
### First Time Setup
```bash
# Install uv (if not already installed)
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# Linux/macOS
curl -LsSf https://astral.sh/uv/install.sh | sh
# Or with pip
pip install uv
```
### Project Setup
```bash
# Clone or navigate to the repository
cd report_skill_expm
# Create virtual environment and install all dependencies
uv sync
# That's it! All dependencies are now installed and locked
```
## Usage
### Option 1: Using `uv run` (Recommended)
No need to activate the virtual environment - uv handles it automatically:
```bash
# Run the example
uv run python example.py
# Run the report generator directly
uv run python skills/week_report_gen/generate_report.py
# Import and use in Python
uv run python -c "from skills.week_report_gen.generate_report import generate_weekly_report; print('Ready!')"
```
### Option 2: Traditional Virtual Environment
```bash
# Activate the virtual environment
.venv\Scripts\activate # Windows
source .venv/bin/activate # Linux/Mac
# Now you can run Python normally
python example.py
python skills/week_report_gen/generate_report.py
```
## What's in pyproject.toml?
```toml
[project]
name = "report-skill-expm"
version = "1.0.0"
requires-python = ">=3.9"
dependencies = [
"openpyxl>=3.1.0", # Excel file handling
"pandas>=2.0.0", # Data processing
"xlrd>=2.0.0", # Reading .xls files
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0", # Testing framework
"black>=23.0.0", # Code formatter
"flake8>=6.0.0", # Linter
]
```
## Common Commands
```bash
# Install/update dependencies
uv sync
# Install with dev dependencies
uv sync --extra dev
# Add a new dependency
uv add package-name
# Remove a dependency
uv remove package-name
# Update all dependencies
uv sync --upgrade
# Show installed packages
uv pip list
# Run any Python script
uv run python your_script.py
# Run a specific module
uv run python -m skills.week_report_gen.generate_report
# Start Python REPL with dependencies available
uv run python
```
## Benefits Over Manual pip Installation
### Before (Manual)
```bash
python -m venv .venv
.venv\Scripts\activate
pip install openpyxl pandas xlrd
# Need to remember all packages and versions
# No lock file - different versions on different machines
```
### After (UV + pyproject.toml)
```bash
uv sync
# Done! Everything locked and reproducible
```
## Dependency Management
### Adding Dependencies
```bash
# Add a runtime dependency
uv add requests
# Add a development dependency
uv add --dev pytest-cov
# Add with version constraint
uv add "pandas>=2.0,<3.0"
```
### Updating Dependencies
```bash
# Update all dependencies
uv sync --upgrade
# Update specific package
uv add --upgrade pandas
```
### Lock File
The `uv.lock` file (auto-generated) ensures:
- ✅ Exact versions are used across all environments
- ✅ Transitive dependencies are locked
- ✅ No "works on my machine" issues
- ✅ Fast, deterministic installs
**Commit `uv.lock` to version control!**
## Troubleshooting
### "uv: command not found"
Install uv first:
```bash
pip install uv
# or
curl -LsSf https://astral.sh/uv/install.sh | sh
```
### "No module named 'xxx'"
Make sure you've run `uv sync`:
```bash
uv sync
```
### Virtual Environment Not Found
Recreate it:
```bash
rm -rf .venv # or rmdir /s .venv on Windows
uv sync
```
### Import Errors
Use `uv run` to automatically activate the environment:
```bash
uv run python your_script.py
```
## CI/CD Integration
### GitHub Actions
```yaml
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install uv
run: pip install uv
- name: Install dependencies
run: uv sync
- name: Run tests
run: uv run pytest
```
### GitLab CI
```yaml
test:
script:
- pip install uv
- uv sync
- uv run pytest
```
## Migration from requirements.txt
If you have an old `requirements.txt`:
```bash
# Import from requirements.txt
uv add $(cat requirements.txt)
# Or manually add each package
uv add openpyxl pandas xlrd
```
## Best Practices
1. **Always commit `uv.lock`** - Ensures reproducible builds
2. **Use `uv run`** - Simplifies workflow, no activation needed
3. **Keep pyproject.toml clean** - Only list direct dependencies
4. **Use version constraints** - `>=3.1.0` not `==3.1.0`
5. **Separate dev dependencies** - Use `[project.optional-dependencies]`
## Comparison: pip vs uv
| Feature | pip | uv |
|---------|-----|-----|
| Speed | 🐌 Slow | 🚀 Fast (10-100x) |
| Lock file | requirements.txt (manual) | uv.lock (automatic) |
| Resolver | Sometimes inconsistent | Always consistent |
| Parallel installs | No | Yes |
| Built-in venv | Need separate commands | Integrated |
## Resources
- [UV Documentation](https://github.com/astral-sh/uv)
- [Python Packaging Guide](https://packaging.python.org/)
- [pyproject.toml Specification](https://peps.python.org/pep-0621/)
---
**Quick Reference Card**
```bash
# Setup
uv sync # Install everything
# Run
uv run python app.py # Execute with dependencies
# Manage
uv add pkg # Add dependency
uv remove pkg # Remove dependency
uv sync --upgrade # Update all
# Dev
uv sync --extra dev # Install dev dependencies
uv run pytest # Run tests
uv run black . # Format code
```

View File

@ -1,405 +0,0 @@
# Weekly Report Generator Skill - Complete Guide
## 🎯 What This Skill Does
The **Weekly Report Generator** (`week_report_gen`) is an AI skill that automatically transforms time tracking data from project management systems into professional weekly project reports (項目週報).
### Key Benefits
**Saves Time**: Automates report generation from raw time tracking data
**Reduces Errors**: Eliminates manual data entry and calculation mistakes
**Consistent Format**: Uses company standard templates every time
**Smart Aggregation**: Automatically groups work by project and team member
**AI-Powered**: Works seamlessly with GitHub Copilot, Claude, and other AI assistants
---
## 📦 What's Included
```
skills/week_report_gen/
├── SKILL.md # Comprehensive technical documentation
├── README.md # User guide with examples
├── QUICK_REFERENCE.md # AI assistant reference guide
├── generate_report.py # Main Python script
└── references/
├── cost-report-*.xls # Example input file
├── 項目週報-模板.xlsx # Standard template
└── 項目週報-*.xlsx # Example outputs
```
---
## 🚀 Quick Start
### 1. Setup (One Time)
```bash
# From repository root: create venv and install all dependencies
uv sync
# Activate it (optional - uv run handles this automatically)
.venv\Scripts\activate # Windows
source .venv/bin/activate # Mac/Linux
```
### 2. Generate Your First Report
**Option A: Using AI Assistant** (Easiest)
Just say:
> "Generate a weekly report from my cost report file"
**Option B: Command Line**
```bash
# From repository root
uv run python skills/week_report_gen/generate_report.py
# Or navigate first
cd skills/week_report_gen
uv run python generate_report.py
```
**Option C: Python Script**
```python
from skills.week_report_gen.generate_report import generate_weekly_report
output_file, summary = generate_weekly_report(
input_file='cost-report.xls',
output_file='weekly-report.xlsx'
)
```
---
## 📊 Input → Output
### Input: Cost Report Excel
Raw time tracking data exported from your project management system.
| 日期 | 使用者 | 活動 | 專案 | 單位 |
|------|--------|------|------|------|
| 2026-01-12 | ben sung | Development | masterXXX | 8 |
| 2026-01-12 | Ryan Hsueh | - | AXEL PLC | 8 |
### Output: Weekly Report Excel
Formatted, professional report ready for management review.
| 專案名稱 | 參與人員 | 工時 | 本周主要進展 | 下周計畫 |
|----------|----------|------|--------------|----------|
| masterXXX | ben sung | 15.0 | Development<br>migrate to entry based sdo queue | _(fill in)_ |
| AXEL PLC | Ryan Hsueh | 48.0 | - | _(fill in)_ |
---
## 🎨 Key Features
### 1. Smart Data Aggregation
- Automatically sums hours by project and person
- Groups multiple entries from the same project
- Combines team members who worked on the same project
### 2. Auto-Population
**Automatically filled:**
- ✅ 專案名稱 (Project name)
- ✅ 參與人員 (Team members)
- ✅ 工時 (Total hours)
- ✅ 本周主要進展 (Progress notes from comments)
**Leave blank for manual input:**
- ⬜ 進度 (Progress percentage)
- ⬜ 交付物 (Deliverables)
- ⬜ 代碼上傳 (Code upload status)
- ⬜ 下周計畫 (Next week's plan)
### 3. Professional Formatting
- Company header and branding
- Proper column widths
- Header formatting with gray background
- Separator rows between projects
- Text wrapping for long entries
- Merged cells for titles
### 4. Date Range Detection
Automatically extracts the reporting period from the data:
```
2026年度週報(01月12日-01月16日
```
---
## 💡 Usage Examples
### Example 1: Basic Generation
```bash
# Navigate to skill directory
cd skills/week_report_gen
# Run with default settings (uses sample file)
python generate_report.py
# Output: 項目週報-智能控制組-20260116.xlsx
```
### Example 2: Custom Files
```bash
# Specify input and output files
python generate_report.py \
"path/to/your-cost-report.xls" \
"path/to/output-weekly-report.xlsx"
```
### Example 3: Python Integration
```python
from generate_report import generate_weekly_report
# Generate report for specific team
output, summary = generate_weekly_report(
input_file='data/cost-report.xls',
output_file='reports/weekly-20260116.xlsx',
template_file='templates/standard.xlsx',
team_name='研發部-AI組'
)
# View summary
print(f"Generated report with {len(summary)} projects")
print(f"Total hours: {summary['工時'].sum()}")
```
### Example 4: AI Assistant
```
You: "Generate a weekly report from cost-report-2026-01-16.xls for the AI team"
AI: "I'll generate the weekly report for the AI team.
[Processing...]
✓ Report generated successfully!
Summary of 5 projects:
- Project A (Team Member 1, Team Member 2, 32 hours)
- Project B (Team Member 3, 16 hours)
...
Report saved to: 項目週報-AI組-20260116.xlsx
Please review and fill in:
- Progress percentages
- Deliverables
- Next week's plan"
```
---
## 📋 After Report Generation
### Manual Steps Required
1. **Open the Excel file** in your spreadsheet application
2. **Review "本周主要進展" (Progress)**
- Check auto-generated progress notes
- Edit for clarity and completeness
- Add any missing accomplishments
3. **Fill in "進度" (Progress %)**
- Enter progress as decimal (0.5 = 50%)
- Example: 0.75 for 75% complete
4. **Add "交付物" (Deliverables)**
- List specific deliverables if any
- Include document names, versions, etc.
5. **Mark "代碼上傳" (Code Upload)**
- Enter "Y" if code was uploaded
- Enter "N" if not applicable
6. **Plan "下周計畫" (Next Week)**
- Outline next week's goals
- Be specific and actionable
7. **Add Visual Materials** (Optional)
- Insert diagrams, screenshots, etc.
- Reference in the header suggestion
---
## 🔧 Customization
### Change Team Name
```python
generate_weekly_report(
input_file='cost.xls',
output_file='report.xlsx',
team_name='您的團隊名稱' # Your team name
)
```
### Adjust Column Widths
Edit `generate_report.py`:
```python
column_widths = {
'B': 25, # Wider project name column
'E': 40, # Wider progress column
# Adjust as needed
}
```
### Modify Grouping Logic
Edit the `format_for_weekly_report()` function to change:
- How projects are grouped
- What information is included in progress
- How team members are listed
---
## 🐛 Troubleshooting
### Error: "Module not found"
**Solution:**
```bash
# Make sure you're in the virtual environment
.venv\Scripts\activate
# Install dependencies
uv pip install openpyxl pandas xlrd
```
### Error: "Column not found"
**Cause:** Input file has different column names
**Solution:**
1. Open the input Excel file
2. Check column names match: 日期, 使用者, 專案, 單位
3. If different, the script will try alternative headers
4. Contact support if issues persist
### Empty or No Output
**Check:**
1. Input file has data (not just headers)
2. Data starts at expected row (usually row 2)
3. File isn't corrupted or password-protected
4. Required columns have values (not all empty)
### Report Looks Wrong
**Verify:**
1. Template file exists and is valid
2. Using correct template for your organization
3. Excel/LibreOffice can open the file
4. File isn't read-only
---
## 📚 Additional Resources
### Documentation Files
- **[SKILL.md](SKILL.md)** - Complete technical documentation
- Detailed API reference
- Function descriptions
- Code examples
- Error handling guide
- **[README.md](README.md)** - Comprehensive user guide
- Feature overview
- Installation instructions
- Usage examples
- Customization options
- **[QUICK_REFERENCE.md](QUICK_REFERENCE.md)** - AI assistant guide
- How to use with AI assistants
- Common patterns
- Troubleshooting for AI
- Best practices
### Example Files
Located in `references/` directory:
- Input example: `cost-report-*.xls`
- Template: `項目週報-模板.xlsx`
- Output example: `項目週報-台灣-軟體部-智能控制組 (20260115).xlsx`
---
## 🎓 Tips & Best Practices
### For Users
1. **Run Weekly**: Generate reports at week-end for best workflow
2. **Review Before Sharing**: Always check auto-generated content
3. **Keep Template Updated**: Update template when format changes
4. **Backup Originals**: Keep raw cost reports for audit trail
5. **Consistent Naming**: Use consistent project names in time tracking
### For Developers
1. **Test with Real Data**: Use actual cost reports for testing
2. **Handle Edge Cases**: Test with empty data, special characters, etc.
3. **Preserve Formulas**: If using formulas, don't hardcode values
4. **Document Changes**: Update SKILL.md when modifying code
5. **Version Control**: Track changes to template and script
### For AI Assistants
1. **Validate First**: Check input file exists before processing
2. **Show Progress**: Display what's being done at each step
3. **Summarize Results**: Show key metrics after generation
4. **Remind Manual Steps**: List fields that need manual input
5. **Handle Errors Gracefully**: Provide helpful error messages
---
## 📞 Support & Contact
### Getting Help
1. **Check Documentation**: Review SKILL.md and README.md
2. **Review Examples**: Look at reference files in `references/`
3. **Test Script**: Run the example script: `python example.py`
4. **Open Issue**: Report bugs or request features
### Reporting Issues
When reporting issues, include:
- Error message (full stack trace)
- Input file format (column names, sample data)
- Expected vs actual output
- Version of Python and libraries
- Operating system
---
## 📝 License
MIT License - See individual skill files for complete terms.
---
## 🙏 Acknowledgments
This skill demonstrates how AI can automate routine reporting tasks, saving valuable time and reducing errors in data transformation workflows.
**Built with:**
- Python 3.x
- openpyxl (Excel file handling)
- pandas (Data processing)
- Love and attention to detail ❤️
---
**Version:** 1.0.0
**Last Updated:** January 16, 2026
**Status:** Production Ready ✅

View File

@ -1,250 +0,0 @@
# Weekly Report Generator - Quick Reference
## For AI Assistants (GitHub Copilot/Claude)
When a user asks to generate a weekly report, follow these steps:
### 1. Identify the Request
User might say:
- "Generate a weekly report"
- "Create 項目週報 from cost report"
- "Transform time tracking data into weekly report"
- "Make a weekly project report from the Excel export"
### 2. Read the Skill Documentation
```python
# Read the full skill instructions
read_file('skills/week_report_gen/SKILL.md')
```
### 3. Use the Generate Report Script
```python
# Import and run the generator
from skills.week_report_gen.generate_report import generate_weekly_report
# Generate report with provided file paths
output_file, summary_df = generate_weekly_report(
input_file='path/to/cost-report.xls',
output_file='path/to/output-report.xlsx',
template_file='skills/week_report_gen/references/項目週報-模板.xlsx',
team_name='智能控制組' # Or user-specified team name
)
print(f"✓ Report generated: {output_file}")
print("\nProject Summary:")
for idx, row in summary_df.iterrows():
print(f"\n{row['專案名稱']}")
print(f" Team: {row['參與人員']}")
print(f" Hours: {row['工時']}")
```
### 4. Alternative: Run via Terminal
```bash
cd skills/week_report_gen
python generate_report.py "path/to/cost-report.xls" "path/to/output.xlsx"
```
## Common Usage Patterns
### Pattern 1: User Provides Input File
```
User: "Generate weekly report from cost-report-2026-01-16.xls"
Assistant Actions:
1. Locate the input file
2. Determine output filename (based on date and team)
3. Run generate_weekly_report()
4. Show summary of projects and hours
5. Confirm file saved location
```
### Pattern 2: User Wants to Customize Output
```
User: "Create weekly report for 研發部 team"
Assistant Actions:
1. Ask for input file if not specified
2. Use team_name parameter: team_name='研發部'
3. Generate report
4. Confirm customization applied
```
### Pattern 3: User Has Multiple Cost Reports
```
User: "Generate reports for all cost reports in the folder"
Assistant Actions:
1. List all .xls/.xlsx files in references folder
2. Filter for cost report files
3. Generate report for each
4. Provide summary of all generated reports
```
## Key Functions
### read_cost_report(file_path)
Reads and parses the cost report Excel file.
**Returns**: DataFrame with columns [日期, 使用者, 活動, 專案, 單位, etc.]
### aggregate_work_hours(df)
Groups work hours by user and project.
**Returns**:
- `summary_df`: Aggregated data
- `start_date`: Report start date
- `end_date`: Report end date
### format_for_weekly_report(summary_df)
Transforms aggregated data into weekly report format.
**Returns**: DataFrame ready for Excel output
### generate_weekly_report(input_file, output_file, template_file, team_name)
Main function that orchestrates the entire process.
**Returns**:
- `output_file`: Path to generated report
- `report_df`: Summary DataFrame
## Example AI Responses
### Example 1: Basic Generation
```
User: "Generate a weekly report from the cost report file"
AI Assistant:
"I'll generate the weekly report from your cost report.
[Runs generate_report.py]
✓ Weekly report generated successfully!
Summary of 8 projects:
- AXEL PLC (Ryan Hsueh, 48 hours)
- CNC Library 移植 (傑 羅, 8 hours)
- masterXXX (ben sung, 15 hours)
...
Report saved to: 項目週報-智能控制組-20260116.xlsx
Please review and fill in the following fields:
- 進度 (Progress percentages)
- 交付物 (Deliverables)
- 代碼上傳 (Code upload status)
- 下周計畫 (Next week's plan)"
```
### Example 2: Custom Team Name
```
User: "Create a weekly report for the 研發部-AI組 team"
AI Assistant:
"I'll create a weekly report for the 研發部-AI組 team.
[Runs with team_name='研發部-AI組']
✓ Report generated with custom team name!
File: 項目週報-研發部-AI組-20260116.xlsx"
```
### Example 3: Batch Processing
```
User: "Generate weekly reports for all cost report files"
AI Assistant:
"I found 3 cost report files. Generating reports...
1. cost-report-2026-01-16.xls → 項目週報-20260116.xlsx ✓
2. cost-report-2026-01-09.xls → 項目週報-20260109.xlsx ✓
3. cost-report-2025-12-30.xls → 項目週報-20251230.xlsx ✓
All reports generated successfully!"
```
## Troubleshooting Guide for AI
### Issue: File Not Found
```python
# Check if file exists
import os
if not os.path.exists(input_file):
# List available files
files = os.listdir('skills/week_report_gen/references')
print(f"Available files: {files}")
# Ask user for correct filename
```
### Issue: Missing Columns
```python
# Check what columns are present
import pandas as pd
df = pd.read_excel(input_file, header=1)
print(f"Available columns: {list(df.columns)}")
# Suggest using different header row or file format
```
### Issue: Empty Output
```python
# Check data was loaded
if len(df) == 0:
print("No data found in file. Check:")
print("1. Correct sheet is being read")
print("2. Data starts at expected row")
print("3. File isn't corrupted")
```
## Best Practices for AI Assistants
1. **Always validate input file exists** before processing
2. **Show summary of data** after reading (number of entries, date range, projects)
3. **Display key metrics** in the output (total hours, number of projects, team members)
4. **Remind user of manual fields** that need to be filled in
5. **Provide file location** of generated report clearly
6. **Handle errors gracefully** with helpful error messages
7. **Suggest next steps** after generation (review, fill in fields, etc.)
## Quick Code Snippets
### Check Available Cost Reports
```python
import os
files = [f for f in os.listdir('skills/week_report_gen/references')
if f.startswith('cost-report') and f.endswith(('.xls', '.xlsx'))]
print(f"Found {len(files)} cost report(s): {files}")
```
### Validate Input File Structure
```python
import pandas as pd
df = pd.read_excel(file_path, header=1)
required = ['日期', '使用者', '專案', '單位']
missing = [col for col in required if col not in df.columns]
if missing:
print(f"⚠ Missing columns: {missing}")
else:
print("✓ File structure is valid")
```
### Preview Data Before Processing
```python
df = pd.read_excel(file_path, header=1)
print(f"Date range: {df['日期'].min()} to {df['日期'].max()}")
print(f"Total entries: {len(df)}")
print(f"Projects: {', '.join(df['專案'].unique()[:5])}")
print(f"Team members: {', '.join(df['使用者'].unique()[:5])}")
```

View File

@ -1,282 +0,0 @@
# Weekly Report Generator - Visual Workflow
```
┌─────────────────────────────────────────────────────────────────────────┐
│ WEEKLY REPORT GENERATOR WORKFLOW │
└─────────────────────────────────────────────────────────────────────────┘
┌──────────────────┐
│ INPUT FILE │
│ (Cost Report) │
│ .xls/.xlsx │
└────────┬─────────┘
│ 日期 使用者 活動 專案 單位
│ 01-12 ben sung Dev masterXXX 8
│ 01-12 Ryan - AXEL PLC 8
│ 01-13 傑 羅 Dev CNC Lib 4
┌─────────────────────────────────┐
│ STEP 1: READ & PARSE │
│ • Load Excel file │
│ • Identify columns │
│ • Clean missing data │
│ • Extract date range │
└────────┬────────────────────────┘
│ DataFrame with validated data
│ Date range: 2026-01-12 to 2026-01-16
┌─────────────────────────────────┐
│ STEP 2: AGGREGATE │
│ • Group by user & project │
│ • Sum work hours │
│ • Combine activities │
│ • Collect comments │
└────────┬────────────────────────┘
│ Project: masterXXX
│ • ben sung: 15 hours
│ • Activities: Development, Specification
│ • Notes: migrate to entry based sdo queue...
┌─────────────────────────────────┐
│ STEP 3: FORMAT │
│ • Group by project │
│ • List team members │
│ • Format progress notes │
│ • Calculate totals │
└────────┬────────────────────────┘
│ Formatted report data ready for Excel
┌─────────────────────────────────┐
│ STEP 4: GENERATE EXCEL │
│ • Load template (if exists) │
│ • Create new sheet │
│ • Write headers │
│ • Write project data │
│ • Apply formatting │
│ • Save file │
└────────┬────────────────────────┘
┌──────────────────────────────────────────────┐
│ OUTPUT FILE (Weekly Report) │
│ 項目週報-智能控制組 │
│ │
│ 弘訊科技股份有限公司 │
│ 2026年度週報(01月12日-01月16日
│ │
│ 專案 參與人員 工時 本周進展 │
│ ──────────────────────────────────────── │
│ AXEL Ryan Hsueh 48.0 - │
│ master ben sung 15.0 Development │
│ XXX migrate to.. │
│ │
└──────────────────────────────────────────────┘
DATA FLOW DIAGRAM
═════════════════
Raw Time Data ──────┐
Export from PM ├─────────► Read Excel ────► Parse Columns
System │ │
│ │
Cost Report File ───┘ ▼
Validate & Clean
Extract Date Range
Group by Project ────┐
│ │
│ │
Sum Hours ◄──────────┤
│ │
│ │
Combine Teams ◄──────┘
Format Progress
Load Template
Write to Excel
Apply Styling
Save Output File
Weekly Report ✓
COMPONENT ARCHITECTURE
══════════════════════
┌─────────────────────────────────────────────────────────────┐
│ SKILL ARCHITECTURE │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ User Interface Layer │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ • Command Line Interface │ │
│ │ • AI Assistant Integration │ │
│ │ • Python API │ │
│ └────────────────┬────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Core Processing Layer │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ • read_cost_report() │ │
│ │ └─► Load Excel, validate columns │ │
│ │ │ │
│ │ • aggregate_work_hours() │ │
│ │ └─► Group data, sum hours, extract dates │ │
│ │ │ │
│ │ • format_for_weekly_report() │ │
│ │ └─► Transform to report format │ │
│ │ │ │
│ │ • generate_weekly_report() │ │
│ │ └─► Main orchestration function │ │
│ └────────────────┬────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Output Generation Layer │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ • Excel Writer (openpyxl) │ │
│ │ • Template Handler │ │
│ │ • Style & Format Applier │ │
│ │ • File Saver │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
▲ ▲
│ │
┌────┴─────┐ ┌──────┴──────┐
│ pandas │ │ openpyxl │
│ (Data │ │ (Excel │
│ Process) │ │ Files) │
└──────────┘ └─────────────┘
FILE ORGANIZATION
═════════════════
skills/week_report_gen/
├── 📄 SKILL.md ─────────────────► Technical documentation
│ • API reference
│ • Function details
│ • Code examples
├── 📄 README.md ────────────────► User guide
│ • Installation
│ • Quick start
│ • Examples
├── 📄 QUICK_REFERENCE.md ───────► AI assistant guide
│ • Usage patterns
│ • Best practices
├── 📄 COMPLETE_GUIDE.md ────────► Comprehensive guide
│ • Everything combined
│ • Tips & tricks
├── 🐍 generate_report.py ───────► Main script
│ • Core functions
│ • Entry point
└── 📁 references/
├── 📊 cost-report-*.xls ────► Example input
├── 📋 項目週報-模板.xlsx ───► Template
└── 📊 項目週報-*.xlsx ──────► Example output
USAGE PATTERNS
══════════════
Pattern 1: AI Assistant
────────────────────────
User: "Generate weekly report"
AI reads SKILL.md
AI runs generate_report.py
AI shows summary
Report saved ✓
Pattern 2: Command Line
───────────────────────
$ python generate_report.py input.xls output.xlsx
Script processes data
Console shows progress
Report saved ✓
Pattern 3: Python Integration
──────────────────────────────
from generate_report import generate_weekly_report
output, summary = generate_weekly_report(...)
Use summary data in your code
Process complete ✓
KEY SUCCESS FACTORS
═══════════════════
✓ Input Validation
└─► Verify file exists, columns present, data valid
✓ Smart Aggregation
└─► Group logically, sum accurately, preserve info
✓ Template Support
└─► Use existing templates, maintain consistency
✓ Error Handling
└─► Clear messages, graceful failures, helpful hints
✓ Formatting
└─► Professional appearance, proper widths, colors
✓ Documentation
└─► Clear examples, complete reference, AI-friendly
```