У меня есть несколько файлов Excel в этом формате.
Они - часы и отмечают время ухода с работы дата и время.
--------------------------------- | Name | Time | --------------------------------- | Person A | 03-Jul-17 8:15 AM | | Person A | 03-Jul-17 10:32 AM | | Person A | 03-Jul-17 1:56 PM | | Person A | 03-Jul-17 6:15 PM | | Person A | 04-Jul-17 8:29 AM | | Person A | 04-Jul-17 8:58 AM | | Person A | 04-Jul-17 9:43 AM | | Person A | 04-Jul-17 1:03 PM | | Person A | 04-Jul-17 2:17 PM | | Person A | 04-Jul-17 5:58 PM | . . . | Person A | 31-Jul-17 7:45 AM | | Person A | 31-Jul-17 8:10 AM | | Person A | 31-Jul-17 3:26 PM | | Person A | 31-Jul-17 7:29 PM | ---------------------------------
Я хотел бы извлечь эти данные и сохранить их как новый файл Excel в этом формате:
--------------------------------------------- | Name | Date | Time In | Time Out | --------------------------------------------- | Person A | 03-Jul-17 | 8:15 AM | 6:15PM | | Person A | 04-Jul-17 | 8:29 AM | 5:58PM | . . . | Person A | 31-Jul-17 | 7:45 AM | 7:29PM | ---------------------------------------------
В основном это должно расположить данные одна запись на дату с самым ранним временем для той даты как Time In
и последнее время для той даты как Time Out
.
В этом формате существует несколько файлов Excel, и выполнение его вручную собирается занять слишком много времени.
Если Вы хотите преобразовать их в .csv
первое редактирование затем преобразовывает их назад в .xlsx
, это прохладно.
PS: Щедрость 200 доступных для всех представителей.
Я преобразовал файлы в csv
и используемый Сценарий PHP для парсинга содержания, создающего его в то, как я на самом деле хотел. Результат был затем сохранен в новом файле затем, те файлы были преобразованы назад в xls
затем объединенный в один ноутбук.
Преобразование и объединяющаяся часть были сделаны вручную. Это не лучшее решение, но это работает на данный момент.
Вот сценарий:
// get list of files from data directory $files = array_diff(scandir('./data'), array('.', '..')); foreach($files as $file): // get all data from the csv file and save in the $data array $csvFile = file('data/'.$file); $data = $list = []; foreach($csvFile as $line) { $data[] = str_getcsv($line); } unset($data[0]); // parse the data array and get the different sections: name. date and time foreach($data as $v) { $date = strtotime($v[1]); $list[date('d-m-Y',$date)][] = array( 'name'=>$v[0], 'date'=>date('d/m/Y',$date), 'in'=>$date ); } // create a new array and save parsed data in it with header columns $new = array(array('Name','Date','Time In','Time Out')); foreach($list as $k => $v) { $out = max(array_column($v, 'in')); $name = $v[0]['name']; $new[] = array( 'name'=>ucwords(strtolower($name)), 'date'=>$v[0]['date'], 'in'=>date('h:i A', $v[0]['in']), 'out'=>date('h:i A', $out) ); } // The name of a new file in the new directory using this file name $filename = str_replace('.csv', '', basename($file)); $fn = strtolower($filename.'-log.csv'); // open the file and output the new array as CSV $out = fopen('new/'.$fn, 'w'); foreach($new as $l) { fputcsv($out, $l, ",",'"'); } fclose($out); endforeach;
Существует 2 сценария, в которых Вы нуждаетесь. Тот для преобразования от XLS до CSV является командой xls2csv и другой сценарий от GitHub: csv2xls (другой csv2xls). Существуют также csv2xlsx (и другой csv2xlsx).
Промежуточный эти 2 преобразования можно отредактировать файлы с помощью любимого инструмента.
Если Вы хотите сделать это сами: файлы xlsx (и то же применяет ODT (open/libeoffice), заархивированы архивы и содержат XML с данными. Можно разархивировать затем, и данные находятся в XML. Управление XML является немного более трудным, что уверенный CSV, но когда управление автоматизировано, это становится довольно эффективным.