Anons79 Mini Shell

Directory : /home/aplikasiposinfo/public_html/talent.gosepakat.id/resources/js/lib/
Upload File :
Current File : /home/aplikasiposinfo/public_html/talent.gosepakat.id/resources/js/lib/excelUtils.ts

import * as XLSX from 'xlsx';

export interface SheetData {
  name: string;
  data: any[][];
  cols: any[];
}

export interface ExcelFile {
  name: string;
  size: number;
  lastModified: number;
  sheets: SheetData[];
  activeSheet: number;
}

export const parseExcelFile = (file: File): Promise<ExcelFile> => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    
    reader.onload = (event) => {
      try {
        const data = new Uint8Array(event.target?.result as ArrayBuffer);
        const workbook = XLSX.read(data, { type: 'array' });
        
        const sheets: SheetData[] = workbook.SheetNames.map((name) => {
          const sheet = workbook.Sheets[name];
          const jsonData = XLSX.utils.sheet_to_json<any>(sheet, { header: 1 });
          
          // Get column info
          const range = XLSX.utils.decode_range(sheet['!ref'] || 'A1');
          const cols = Array(range.e.c - range.s.c + 1).fill(null).map((_, i) => ({
            key: i,
            width: getColumnWidth(jsonData, i),
          }));
          
          return {
            name,
            data: jsonData,
            cols,
          };
        });

        resolve({
          name: file.name,
          size: file.size,
          lastModified: file.lastModified,
          sheets,
          activeSheet: 0,
        });
      } catch (error) {
        reject(error);
      }
    };
    
    reader.onerror = (error) => reject(error);
    reader.readAsArrayBuffer(file);
  });
};

// Helper function to determine column width based on content
const getColumnWidth = (data: any[][], colIndex: number): number => {
  let maxWidth = 0;
  
  for (let i = 0; i < Math.min(100, data.length); i++) {
    const row = data[i];
    if (row && row[colIndex] !== undefined) {
      const content = String(row[colIndex]);
      maxWidth = Math.max(maxWidth, content.length);
    }
  }
  
  // Set reasonable bounds for column width
  return Math.min(Math.max(maxWidth * 8, 80), 300);
};

export const formatFileSize = (bytes: number): string => {
  if (bytes === 0) return '0 Bytes';
  
  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
};

export const formatDate = (timestamp: number): string => {
  return new Date(timestamp).toLocaleString();
};

export const downloadSheet = (data: SheetData, fileName: string, format: string): void => {
  const worksheet = XLSX.utils.aoa_to_sheet(data.data);
  const workbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, worksheet, data.name);
  
  let exportedFileName = fileName;
  if (!exportedFileName.includes('.')) {
    exportedFileName += '.' + format;
  }
  
  XLSX.writeFile(workbook, exportedFileName);
};

Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]