KEXEL/git
0
1<!DOCTYPE html>2<html lang="en">3<head>4 <meta charset="UTF-8">5 <meta name="viewport" content="width=device-width, initial-scale=1.0">6 <title>Excel File Reader - Show All Text</title>7 <script src="https://cdn.tailwindcss.com"></script>8 <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>9 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">10 <style>11 .file-input-wrapper {12 position: relative;13 overflow: hidden;14 display: inline-block;15 }16 .file-input-wrapper input[type=file] {17 font-size: 100px;18 position: absolute;19 left: 0;20 top: 0;21 opacity: 0;22 cursor: pointer;23 }24 .excel-grid-container {25 position: relative;26 overflow: auto;27 border: 1px solid #e2e8f0;28 border-radius: 0.5rem;29 max-height: none !important;30 }31 .excel-sheet {32 position: relative;33 min-width: 100%;34 }35 .excel-cell {36 position: absolute;37 box-sizing: border-box;38 border: 1px solid #e2e8f0;39 padding: 4px 8px;40 font-size: 14px;41 overflow: visible;42 white-space: normal;43 word-wrap: break-word;44 background-color: white;45 min-height: 30px;46 }47 .excel-header {48 background-color: #f8fafc;49 font-weight: 600;50 }51 .excel-col-header {52 position: absolute;53 top: 0;54 z-index: 10;55 background-color: #f8fafc;56 font-weight: 600;57 text-align: center;58 border: 1px solid #e2e8f0;59 }60 .excel-row-header {61 position: sticky;62 left: 0;63 z-index: 10;64 background-color: #f8fafc;65 font-weight: 600;66 text-align: center;67 border: 1px solid #e2e8f0;68 }69 .excel-corner {70 position: sticky;71 top: 0;72 left: 0;73 z-index: 20;74 background-color: #f8fafc;75 border: 1px solid #e2e8f0;76 }77 .merged-cell {78 background-color: #f0f9ff;79 }80 .text-bold {81 font-weight: bold;82 }83 .text-italic {84 font-style: italic;85 }86 .text-underline {87 text-decoration: underline;88 }89 .text-center {90 text-align: center;91 }92 .text-right {93 text-align: right;94 }95 .text-left {96 text-align: left;97 }98 .bg-yellow {99 background-color: #fef9c3;100 }101 .bg-green {102 background-color: #dcfce7;103 }104 .bg-red {105 background-color: #fee2e2;106 }107 .bg-blue {108 background-color: #dbeafe;109 }110 .pulse {111 animation: pulse 2s infinite;112 }113 @keyframes pulse {114 0% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4); }115 70% { box-shadow: 0 0 0 10px rgba(59, 130, 246, 0); }116 100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); }117 }118 .sheet-tab {119 transition: all 0.2s ease;120 }121 .sheet-tab:hover {122 transform: translateY(-2px);123 }124 .sheet-tab.active {125 border-bottom: 3px solid #3b82f6;126 font-weight: 600;127 }128 /* New styles to ensure all text is visible */129 .auto-height {130 height: auto !important;131 min-height: 30px;132 }133 .text-preserve {134 white-space: pre-wrap !important;135 overflow: visible !important;136 }137 </style>138</head>139<body class="bg-gray-50 min-h-screen">140 <div class="container mx-auto px-4 py-8">141 <div class="max-w-6xl mx-auto">142 <!-- Header -->143 <div class="text-center mb-10">144 <h1 class="text-4xl font-bold text-blue-600 mb-2">Excel File Reader</h1>145 <p class="text-gray-600">View your Excel files with all text preserved</p>146 </div>147 148 <!-- Upload Card -->149 <div class="bg-white rounded-xl shadow-md overflow-hidden mb-8 transition-all duration-300 hover:shadow-lg">150 <div class="p-6">151 <div class="flex flex-col items-center justify-center py-12 px-4 border-2 border-dashed border-gray-300 rounded-lg bg-gray-50">152 <div class="file-input-wrapper">153 <button id="uploadBtn" class="flex items-center px-6 py-3 bg-blue-600 text-white rounded-lg shadow-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 pulse">154 <i class="fas fa-file-excel mr-2"></i>155 Choose Excel File156 </button>157 <input id="fileInput" type="file" accept=".xlsx, .xls" class="hidden">158 </div>159 <p class="mt-4 text-gray-500">or drag and drop your file here</p>160 <p class="text-sm text-gray-400 mt-2">Supports .xlsx and .xls files</p>161 </div>162 <div id="fileInfo" class="mt-4 hidden">163 <div class="flex items-center justify-between bg-blue-50 p-3 rounded-lg">164 <div class="flex items-center">165 <i class="fas fa-file-excel text-blue-600 text-xl mr-3"></i>166 <div>167 <p id="fileName" class="font-medium text-gray-800"></p>168 <p id="fileSize" class="text-sm text-gray-500"></p>169 </div>170 </div>171 <button id="clearBtn" class="text-red-500 hover:text-red-700">172 <i class="fas fa-times"></i>173 </button>174 </div>175 </div>176 </div>177 </div>178 179 <!-- Sheets Navigation -->180 <div id="sheetsNav" class="hidden mb-6">181 <div class="flex space-x-1 overflow-x-auto pb-2">182 <!-- Sheets tabs will be added here dynamically -->183 </div>184 </div>185 186 <!-- Data Preview -->187 <div id="dataPreview" class="hidden">188 <div class="bg-white rounded-xl shadow-md overflow-hidden mb-8">189 <div class="px-6 py-4 border-b border-gray-200 flex justify-between items-center">190 <h3 class="text-lg font-medium text-gray-900">Sheet Preview</h3>191 <div class="flex space-x-2">192 <button id="downloadJsonBtn" class="flex items-center px-3 py-1.5 bg-green-100 text-green-800 rounded-md text-sm hover:bg-green-200">193 <i class="fas fa-file-code mr-1"></i> JSON194 </button>195 <button id="downloadCsvBtn" class="flex items-center px-3 py-1.5 bg-blue-100 text-blue-800 rounded-md text-sm hover:bg-blue-200">196 <i class="fas fa-file-csv mr-1"></i> CSV197 </button>198 <button id="toggleAutoHeight" class="flex items-center px-3 py-1.5 bg-purple-100 text-purple-800 rounded-md text-sm hover:bg-purple-200">199 <i class="fas fa-arrows-alt-v mr-1"></i> Auto Height200 </button>201 </div>202 </div>203 <div class="p-6">204 <div class="excel-grid-container" style="max-height: 70vh;">205 <div id="excelContainer"></div>206 </div>207 </div>208 </div>209 </div>210 211 <!-- Statistics -->212 <div id="statsSection" class="hidden">213 <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-8">214 <div class="bg-white rounded-xl shadow-md p-6">215 <div class="flex items-center">216 <div class="p-3 rounded-full bg-blue-100 text-blue-600 mr-4">217 <i class="fas fa-table text-lg"></i>218 </div>219 <div>220 <p class="text-sm text-gray-500">Sheets</p>221 <p id="sheetsCount" class="text-2xl font-semibold">0</p>222 </div>223 </div>224 </div>225 <div class="bg-white rounded-xl shadow-md p-6">226 <div class="flex items-center">227 <div class="p-3 rounded-full bg-green-100 text-green-600 mr-4">228 <i class="fas fa-columns text-lg"></i>229 </div>230 <div>231 <p class="text-sm text-gray-500">Columns</p>232 <p id="columnsCount" class="text-2xl font-semibold">0</p>233 </div>234 </div>235 </div>236 <div class="bg-white rounded-xl shadow-md p-6">237 <div class="flex items-center">238 <div class="p-3 rounded-full bg-purple-100 text-purple-600 mr-4">239 <i class="fas fa-list text-lg"></i>240 </div>241 <div>242 <p class="text-sm text-gray-500">Rows</p>243 <p id="rowsCount" class="text-2xl font-semibold">0</p>244 </div>245 </div>246 </div>247 </div>248 </div>249 </div>250 </div>251 252 <script>253 document.addEventListener('DOMContentLoaded', function() {254 const fileInput = document.getElementById('fileInput');255 const uploadBtn = document.getElementById('uploadBtn');256 const fileInfo = document.getElementById('fileInfo');257 const fileName = document.getElementById('fileName');258 const fileSize = document.getElementById('fileSize');259 const clearBtn = document.getElementById('clearBtn');260 const sheetsNav = document.getElementById('sheetsNav');261 const dataPreview = document.getElementById('dataPreview');262 const excelContainer = document.getElementById('excelContainer');263 const downloadJsonBtn = document.getElementById('downloadJsonBtn');264 const downloadCsvBtn = document.getElementById('downloadCsvBtn');265 const toggleAutoHeight = document.getElementById('toggleAutoHeight');266 const statsSection = document.getElementById('statsSection');267 const sheetsCount = document.getElementById('sheetsCount');268 const columnsCount = document.getElementById('columnsCount');269 const rowsCount = document.getElementById('rowsCount');270 let workbook = null;271 let currentSheet = null;272 let jsonData = null;273 let autoHeightEnabled = false;274 const cellWidth = 120;275 const defaultCellHeight = 30;276 const headerSize = 25;277 // Handle file selection278 uploadBtn.addEventListener('click', function() {279 fileInput.click();280 });281 fileInput.addEventListener('change', function(e) {282 if (e.target.files.length) {283 const file = e.target.files[0];284 processFile(file);285 }286 });287 // Handle drag and drop288 const dropArea = document.querySelector('.bg-gray-50');289 290 ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {291 dropArea.addEventListener(eventName, preventDefaults, false);292 });293 function preventDefaults(e) {294 e.preventDefault();295 e.stopPropagation();296 }297 ['dragenter', 'dragover'].forEach(eventName => {298 dropArea.addEventListener(eventName, highlight, false);299 });300 ['dragleave', 'drop'].forEach(eventName => {301 dropArea.addEventListener(eventName, unhighlight, false);302 });303 function highlight() {304 dropArea.classList.add('bg-blue-50', 'border-blue-300');305 }306 function unhighlight() {307 dropArea.classList.remove('bg-blue-50', 'border-blue-300');308 }309 dropArea.addEventListener('drop', function(e) {310 const dt = e.dataTransfer;311 const file = dt.files[0];312 313 if (file && (file.name.endsWith('.xlsx') || file.name.endsWith('.xls'))) {314 fileInput.files = dt.files;315 processFile(file);316 } else {317 alert('Please upload an Excel file (.xlsx or .xls)');318 }319 });320 // Clear file321 clearBtn.addEventListener('click', function() {322 resetUI();323 });324 // Toggle auto height325 toggleAutoHeight.addEventListener('click', function() {326 autoHeightEnabled = !autoHeightEnabled;327 if (autoHeightEnabled) {328 this.classList.add('bg-purple-200');329 this.classList.remove('bg-purple-100');330 document.querySelectorAll('.excel-cell').forEach(cell => {331 cell.classList.add('auto-height');332 cell.style.height = 'auto';333 });334 } else {335 this.classList.remove('bg-purple-200');336 this.classList.add('bg-purple-100');337 document.querySelectorAll('.excel-cell').forEach(cell => {338 cell.classList.remove('auto-height');339 cell.style.height = defaultCellHeight + 'px';340 });341 }342 343 if (workbook && currentSheet) {344 loadSheet(currentSheet);345 }346 });347 // Process the uploaded file348 function processFile(file) {349 fileName.textContent = file.name;350 fileSize.textContent = formatFileSize(file.size);351 fileInfo.classList.remove('hidden');352 uploadBtn.classList.remove('pulse');353 const reader = new FileReader();354 reader.onload = function(e) {355 const data = new Uint8Array(e.target.result);356 workbook = XLSX.read(data, { type: 'array', cellStyles: true, cellText: true });357 358 // Update stats359 sheetsCount.textContent = workbook.SheetNames.length;360 361 // Show sheets navigation362 renderSheetsNav(workbook.SheetNames);363 364 // Load first sheet by default365 loadSheet(workbook.SheetNames[0]);366 367 // Show preview and stats sections368 dataPreview.classList.remove('hidden');369 statsSection.classList.remove('hidden');370 };371 reader.readAsArrayBuffer(file);372 }373 // Format file size374 function formatFileSize(bytes) {375 if (bytes === 0) return '0 Bytes';376 const k = 1024;377 const sizes = ['Bytes', 'KB', 'MB', 'GB'];378 const i = Math.floor(Math.log(bytes) / Math.log(k));379 return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];380 }381 // Render sheets navigation382 function renderSheetsNav(sheetNames) {383 sheetsNav.classList.remove('hidden');384 const sheetsContainer = sheetsNav.querySelector('.flex');385 sheetsContainer.innerHTML = '';386 387 sheetNames.forEach((name, index) => {388 const tab = document.createElement('button');389 tab.className = `sheet-tab px-4 py-2 text-sm font-medium text-gray-600 hover:text-blue-600 ${index === 0 ? 'active' : ''}`;390 tab.textContent = name;391 tab.dataset.sheetName = name;392 tab.addEventListener('click', function() {393 document.querySelectorAll('.sheet-tab').forEach(t => t.classList.remove('active'));394 this.classList.add('active');395 loadSheet(this.dataset.sheetName);396 });397 sheetsContainer.appendChild(tab);398 });399 }400 // Load sheet data401 function loadSheet(sheetName) {402 currentSheet = sheetName;403 const worksheet = workbook.Sheets[sheetName];404 405 // Get the range of the sheet406 const range = worksheet['!ref'] ? XLSX.utils.decode_range(worksheet['!ref']) : {s: {c:0, r:0}, e: {c:0, r:0}};407 408 // Update stats409 columnsCount.textContent = range.e.c - range.s.c + 1;410 rowsCount.textContent = range.e.r - range.s.r + 1;411 412 // Render the sheet with original layout413 renderExcelSheet(worksheet, range);414 }415 // Render Excel sheet with original layout416 function renderExcelSheet(worksheet, range) {417 excelContainer.innerHTML = '';418 419 // Create sheet container420 const sheetContainer = document.createElement('div');421 sheetContainer.className = 'excel-sheet';422 423 // Calculate sheet dimensions424 const width = (range.e.c - range.s.c + 1) * cellWidth + headerSize;425 const height = (range.e.r - range.s.r + 1) * defaultCellHeight + headerSize;426 427 sheetContainer.style.width = `${width}px`;428 sheetContainer.style.height = `${height}px`;429 430 // Create corner header431 const cornerHeader = document.createElement('div');432 cornerHeader.className = 'excel-corner';433 cornerHeader.style.width = `${headerSize}px`;434 cornerHeader.style.height = `${headerSize}px`;435 cornerHeader.style.top = '0';436 cornerHeader.style.left = '0';437 sheetContainer.appendChild(cornerHeader);438 439 // Create column headers440 for (let C = range.s.c; C <= range.e.c; ++C) {441 const colHeader = document.createElement('div');442 colHeader.className = 'excel-col-header';443 colHeader.style.width = `${cellWidth}px`;444 colHeader.style.height = `${headerSize}px`;445 colHeader.style.left = `${headerSize + (C - range.s.c) * cellWidth}px`;446 colHeader.style.top = '0';447 colHeader.textContent = XLSX.utils.encode_col(C);448 sheetContainer.appendChild(colHeader);449 }450 451 // Create row headers452 for (let R = range.s.r; R <= range.e.r; ++R) {453 const rowHeader = document.createElement('div');454 rowHeader.className = 'excel-row-header';455 rowHeader.style.width = `${headerSize}px`;456 rowHeader.style.height = `${defaultCellHeight}px`;457 rowHeader.style.left = '0';458 rowHeader.style.top = `${headerSize + (R - range.s.r) * defaultCellHeight}px`;459 rowHeader.textContent = (R + 1).toString();460 sheetContainer.appendChild(rowHeader);461 }462 463 // Process each cell464 for (let R = range.s.r; R <= range.e.r; ++R) {465 for (let C = range.s.c; C <= range.e.c; ++C) {466 const cell_address = {c: C, r: R};467 const cell_ref = XLSX.utils.encode_cell(cell_address);468 469 // Create cell470 const cell = document.createElement('div');471 cell.className = 'excel-cell text-preserve';472 cell.style.width = `${cellWidth}px`;473 cell.style.left = `${headerSize + (C - range.s.c) * cellWidth}px`;474 cell.style.top = `${headerSize + (R - range.s.r) * defaultCellHeight}px`;475 476 // Check if cell exists in worksheet477 if (worksheet[cell_ref]) {478 const excelCell = worksheet[cell_ref];479 480 // Set cell content - preserve all text481 if (excelCell.w) {482 // Use formatted text if available483 cell.innerHTML = excelCell.w.replace(/\n/g, '<br>');484 } else if (excelCell.v !== undefined && excelCell.v !== null) {485 // Use raw value otherwise486 if (typeof excelCell.v === 'string') {487 cell.innerHTML = excelCell.v.replace(/\n/g, '<br>');488 } else {489 cell.textContent = excelCell.v.toString();490 }491 }492 493 // Apply cell styles with more precision494 applyCellStyles(cell, excelCell);495 496 // Handle merged cells497 if (worksheet['!merges']) {498 const merge = worksheet['!merges'].find(m => {499 return R >= m.s.r && R <= m.e.r && 500 C >= m.s.c && C <= m.e.c;501 });502 503 if (merge) {504 cell.classList.add('merged-cell');505 cell.style.width = `${(merge.e.c - merge.s.c + 1) * cellWidth}px`;506 507 // For merged cells, we need to calculate the height based on content508 if (autoHeightEnabled) {509 cell.style.height = 'auto';510 cell.classList.add('auto-height');511 } else {512 cell.style.height = `${(merge.e.r - merge.s.r + 1) * defaultCellHeight}px`;513 }514 515 // Center content in merged cells by default516 if (!cell.style.textAlign) {517 cell.style.textAlign = 'center';518 cell.style.display = 'flex';519 cell.style.alignItems = 'center';520 cell.style.justifyContent = 'center';521 }522 }523 }524 525 // Auto height for regular cells526 if (autoHeightEnabled && !cell.classList.contains('merged-cell')) {527 cell.style.height = 'auto';528 cell.classList.add('auto-height');529 } else if (!cell.classList.contains('merged-cell')) {530 cell.style.height = defaultCellHeight + 'px';531 }532 } else {533 // Empty cell534 cell.style.height = defaultCellHeight + 'px';535 if (autoHeightEnabled) {536 cell.style.height = 'auto';537 cell.classList.add('auto-height');538 }539 }540 541 sheetContainer.appendChild(cell);542 }543 }544 545 excelContainer.appendChild(sheetContainer);546 547 // After rendering, adjust heights for cells with lots of text548 if (autoHeightEnabled) {549 adjustCellHeights();550 }551 }552 // Adjust cell heights based on content553 function adjustCellHeights() {554 document.querySelectorAll('.excel-cell').forEach(cell => {555 // Create a clone to measure the height556 const clone = document.createElement('div');557 clone.style.position = 'absolute';558 clone.style.visibility = 'hidden';559 clone.style.width = cell.offsetWidth + 'px';560 clone.style.padding = window.getComputedStyle(cell).padding;561 clone.style.whiteSpace = 'pre-wrap';562 clone.style.wordWrap = 'break-word';563 clone.innerHTML = cell.innerHTML;564 565 document.body.appendChild(clone);566 const height = clone.offsetHeight + 8; // Add some padding567 document.body.removeChild(clone);568 569 // Set the minimum height to show all content570 cell.style.height = Math.max(height, defaultCellHeight) + 'px';571 });572 }573 // Apply Excel cell styles to HTML cell with more precision574 function applyCellStyles(cell, excelCell) {575 if (!excelCell.s) return;576 577 const style = excelCell.s;578 let cellStyle = '';579 580 // Font styles581 if (style.font) {582 const font = style.font;583 584 if (font.bold) cell.classList.add('text-bold');585 if (font.italic) cell.classList.add('text-italic');586 if (font.underline) cell.classList.add('text-underline');587 588 // Font family589 if (font.name) {590 cellStyle += `font-family: ${font.name}, sans-serif;`;591 }592 593 // Font color594 if (font.color && font.color.rgb) {595 cellStyle += `color: #${font.color.rgb.slice(2)};`;596 }597 598 // Font size599 if (font.sz) {600 cellStyle += `font-size: ${font.sz}pt;`;601 }602 }603 604 // Alignment605 if (style.alignment) {606 const align = style.alignment.horizontal;607 if (align === 'center') {608 cell.classList.add('text-center');609 } else if (align === 'right') {610 cell.classList.add('text-right');611 } else if (align === 'left') {612 cell.classList.add('text-left');613 }614 615 // Vertical alignment616 if (style.alignment.vertical) {617 const vertical = style.alignment.vertical;618 if (vertical === 'top') {619 cellStyle += 'vertical-align: top;';620 } else if (vertical === 'center') {621 cellStyle += 'vertical-align: middle;';622 } else if (vertical === 'bottom') {623 cellStyle += 'vertical-align: bottom;';624 }625 626 // For vertical alignment to work properly627 cellStyle += 'display: flex; align-items: center;';628 }629 630 // Wrap text - always enabled to prevent text loss631 cellStyle += 'white-space: pre-wrap; word-wrap: break-word; overflow: visible;';632 633 // Indent634 if (style.alignment.indent) {635 cellStyle += `padding-left: ${style.alignment.indent * 10}px;`;636 }637 }638 639 // Fill (background color)640 if (style.fill && style.fill.fgColor && style.fill.fgColor.rgb) {641 const bgColor = `#${style.fill.fgColor.rgb.slice(2)}`;642 cellStyle += `background-color: ${bgColor};`;643 } else if (style.fill && style.fill.patternType === 'solid' && style.fill.bgColor && style.fill.bgColor.rgb) {644 const bgColor = `#${style.fill.bgColor.rgb.slice(2)}`;645 cellStyle += `background-color: ${bgColor};`;646 }647 648 // Borders649 if (style.border) {650 const border = style.border;651 652 if (border.top && border.top.style) {653 const color = border.top.color?.rgb ? `#${border.top.color.rgb.slice(2)}` : '#94a3b8';654 const width = border.top.style === 'thin' ? '1px' : 655 border.top.style === 'medium' ? '2px' : 656 border.top.style === 'thick' ? '3px' : '1px';657 cellStyle += `border-top: ${width} solid ${color};`;658 }659 if (border.bottom && border.bottom.style) {660 const color = border.bottom.color?.rgb ? `#${border.bottom.color.rgb.slice(2)}` : '#94a3b8';661 const width = border.bottom.style === 'thin' ? '1px' : 662 border.bottom.style === 'medium' ? '2px' : 663 border.bottom.style === 'thick' ? '3px' : '1px';664 cellStyle += `border-bottom: ${width} solid ${color};`;665 }666 if (border.left && border.left.style) {667 const color = border.left.color?.rgb ? `#${border.left.color.rgb.slice(2)}` : '#94a3b8';668 const width = border.left.style === 'thin' ? '1px' : 669 border.left.style === 'medium' ? '2px' : 670 border.left.style === 'thick' ? '3px' : '1px';671 cellStyle += `border-left: ${width} solid ${color};`;672 }673 if (border.right && border.right.style) {674 const color = border.right.color?.rgb ? `#${border.right.color.rgb.slice(2)}` : '#94a3b8';675 const width = border.right.style === 'thin' ? '1px' : 676 border.right.style === 'medium' ? '2px' : 677 border.right.style === 'thick' ? '3px' : '1px';678 cellStyle += `border-right: ${width} solid ${color};`;679 }680 }681 682 // Number formatting683 if (excelCell.z) {684 // You could add specific formatting for numbers, dates, etc.685 // For example, format dates, currency, percentages, etc.686 }687 688 // Apply all styles at once689 if (cellStyle) {690 cell.style.cssText += cellStyle;691 }692 693 // Padding - Excel default is different from our default694 cell.style.padding = '4px 8px';695 }696 // Download as JSON697 downloadJsonBtn.addEventListener('click', function() {698 if (!workbook || !currentSheet) return;699 700 const worksheet = workbook.Sheets[currentSheet];701 const json = XLSX.utils.sheet_to_json(worksheet);702 703 const blob = new Blob([JSON.stringify(json, null, 2)], { type: 'application/json' });704 const url = URL.createObjectURL(blob);705 706 const a = document.createElement('a');707 a.href = url;708 a.download = `${currentSheet}.json`;709 document.body.appendChild(a);710 a.click();711 document.body.removeChild(a);712 URL.revokeObjectURL(url);713 });714 // Download as CSV715 downloadCsvBtn.addEventListener('click', function() {716 if (!workbook || !currentSheet) return;717 718 const worksheet = workbook.Sheets[currentSheet];719 const csv = XLSX.utils.sheet_to_csv(worksheet);720 721 const blob = new Blob([csv], { type: 'text/csv' });722 const url = URL.createObjectURL(blob);723 724 const a = document.createElement('a');725 a.href = url;726 a.download = `${currentSheet}.csv`;727 document.body.appendChild(a);728 a.click();729 document.body.removeChild(a);730 URL.revokeObjectURL(url);731 });732 // Reset UI733 function resetUI() {734 fileInput.value = '';735 fileInfo.classList.add('hidden');736 sheetsNav.classList.add('hidden');737 dataPreview.classList.add('hidden');738 statsSection.classList.add('hidden');739 uploadBtn.classList.add('pulse');740 workbook = null;741 currentSheet = null;742 jsonData = null;743 excelContainer.innerHTML = '';744 autoHeightEnabled = false;745 toggleAutoHeight.classList.remove('bg-purple-200');746 toggleAutoHeight.classList.add('bg-purple-100');747 }748 });749 </script>750<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=KEXEL/excel-file-reader" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>751</html>752 