Free online tool to extract hyperlinks from spreadsheet files and merge Title + URL into clickable links.
🔗 Live Site: sheetlink.hyunjo.uk
- Excel Link Extraction: Extract hyperlinks from Excel/spreadsheet cells and export URLs
- Excel Link Merging: Combine separate Title and URL columns into clickable hyperlinks in Excel
- Excel Format Support: Works with Microsoft Excel files (.xlsx, .xls)
- No Server Storage: All processing happens in-memory (privacy-focused)
- Free & Open Source: No registration required
- Backend: ASP.NET Core 10.0 (Blazor Server)
- Excel Processing: DocumentFormat.OpenXml (Microsoft official)
- Deployment: Docker + Cloudflare Tunnel
- CI/CD: GitHub Actions (automated Docker builds)
- Container Registry: Docker Hub
- Hosting: Self-hosted on Ubuntu 24.04
dotnet run --project ExcelLinkExtractorWebVisit http://localhost:5050
dotnet builddotnet publish ExcelLinkExtractorWeb -c Release -o ./publishThe app exposes a basic health endpoint at /health (memory/disk check) for probes/load balancers.
Prometheus exposition is available at /metrics (powered by prometheus-net) with counters/histograms for extract/merge. Scrape with Prometheus or query locally with curl http://localhost:5050/metrics.
Static assets are cacheable (1 week). Response caching is enabled for GET requests where applicable.
Quick Start (from Docker Hub):
docker run -d -p 5050:5050 hyunjojung/sheetlink:latestUsing docker-compose:
docker compose up -d
# App listens on http://localhost:5050Automated Deployment:
- Docker images are automatically built on every push to master via GitHub Actions
- Published to hyunjojung/sheetlink on Docker Hub
See Docker Deployment Guide for production deployment.
# Build
dotnet build
# Unit tests (xUnit)
dotnet test ExcelLinkExtractor.Tests/ExcelLinkExtractor.Tests.csproj
# E2E tests (NUnit + Playwright; auto-starts local server on a free port)
DOTNET_ROOT=/home/dev/.dotnet dotnet test ExcelLinkExtractorWeb.E2ETests/ExcelLinkExtractorWeb.E2ETests.csproj
# Coverage (writes cobertura to TestResults/coverage)
dotnet test ExcelLinkExtractor.Tests/ExcelLinkExtractor.Tests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=TestResults/coverage/
# Health/metrics (local)
curl http://localhost:5050/health
curl http://localhost:5050/metricsExcelLinkExtractor/
├── ExcelLinkExtractorWeb/ # Main web application
│ ├── Components/
│ │ ├── Pages/ # Blazor pages (Home, Merge, FAQ, Error)
│ │ ├── Shared/ # Reusable UI (ResultCard, FileUploadPanel, HowToUseCard)
│ │ └── Layout/ # Layout components and navigation
│ ├── Services/
│ │ ├── LinkExtractor/ # Excel processing split by concern (partial class)
│ │ ├── Metrics/ # In-memory metrics service
│ │ └── Health/ # Health checks
│ └── wwwroot/ # Static files
└── LICENSE # Apache License 2.0
- Architecture: docs/ARCHITECTURE.md
- Configuration: docs/CONFIGURATION.md
- Security: docs/SECURITY.md
- Troubleshooting: docs/TROUBLESHOOTING.md
- Contributing: docs/CONTRIBUTING.md
- Index: docs/README.md
All URLs are validated and sanitized:
- Automatically adds
https://if missing - Validates URL format with
Uri.TryCreate - Restricts to
http,https,mailtoschemes only - 2000 character limit (Excel hyperlink limitation)
- Searches first 10 rows for header columns
- Supports
.xlsxand.xlsformats - 10MB file size limit
- Preserves cell styling where possible
Suggestions and bug reports are welcome via GitHub issues.
SheetLink is an independent, open-source project and is not affiliated with, endorsed by, or sponsored by Microsoft Corporation.
"Excel" and "Microsoft Excel" are trademarks of Microsoft Corporation. This tool provides functionality to work with Excel file formats (.xlsx, .xls) but is developed and maintained independently. All Excel-related file processing is performed using open-source libraries (DocumentFormat.OpenXml).
Apache License 2.0 - see LICENSE for details.
Created by HyunjoJung

