You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
313 lines
12 KiB
313 lines
12 KiB
package ru.egspt; |
|
|
|
import java.io.File; |
|
import java.io.FileInputStream; |
|
import java.io.FileOutputStream; |
|
import java.io.IOException; |
|
import java.time.LocalTime; |
|
import java.util.ArrayList; |
|
|
|
import javax.swing.table.AbstractTableModel; |
|
import org.apache.poi.ss.usermodel.Cell; |
|
import org.apache.poi.ss.usermodel.Row; |
|
import org.apache.poi.xssf.usermodel.XSSFSheet; |
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
|
|
|
public class ReportTableModel extends AbstractTableModel{ |
|
private Object[] header; |
|
private Object[][] data; |
|
//создаем модель без данных |
|
public ReportTableModel(){} |
|
public ReportTableModel(Object[] header, Object[][] data){ |
|
setHeader(header); |
|
setData(data); |
|
} |
|
//создаем модель по данным Data |
|
public ReportTableModel(Data data){ |
|
setHeader(getHeaderByQuize(data)); |
|
setData(data); |
|
} |
|
//создаем модель по данным предварительно переданным в App |
|
public ReportTableModel(App app){ |
|
setHeader(getHeaderByQuize(app.getData())); |
|
setData(app.getData()); |
|
} |
|
@Override |
|
public int getRowCount() { |
|
return getData().length; |
|
} |
|
|
|
@Override |
|
public int getColumnCount() { |
|
return getHeader().length; |
|
} |
|
|
|
@Override |
|
public Object getValueAt(int rowIndex, int columnIndex) { |
|
return getData()[rowIndex][columnIndex]; |
|
} |
|
/** |
|
* @param header the header to set |
|
*/ |
|
public void setHeader(Object[] header) { |
|
this.header = header; |
|
} |
|
/** |
|
* Настройка заголовков отчета |
|
* @param data |
|
*/ |
|
public Object[] getHeaderByQuize(Data report){ |
|
/** |
|
* Определение количества заголовков: |
|
* первые три заголовка определяются таблицей пользователей и всегда постоянны |
|
* остальные заголовки определяются: |
|
* количеством тестов, в прохождении которых участвовали пользователи, помноженным на |
|
* количество отчетных данных (результат сдачи теста и время потраченное на прохождение теста) |
|
*/ |
|
ArrayList<Object> header = new ArrayList<Object>(); |
|
header.add("id"); |
|
header.add("login"); |
|
header.add("mail"); |
|
//заголовки по названиям опросов |
|
int i = 0; |
|
while (i < report.getQuizes().size()){ |
|
header.add(report.getQuizes().get(i).getName()); |
|
header.add(""); |
|
i++; |
|
} |
|
//преобразуем список в массив |
|
Object[] h = new Object[header.size()]; |
|
int j = 0; |
|
while (j < header.size()){ |
|
h[j] = header.get(j); |
|
j++; |
|
} |
|
return h; |
|
} |
|
/** |
|
* @return the header |
|
*/ |
|
public Object[] getHeader() { |
|
return header; |
|
} |
|
/** |
|
* |
|
*/ |
|
public void setData(Object[][] data){ |
|
this.data = data; |
|
} |
|
/** |
|
* добавить проверку соответствия данных поля и заголовка столбца |
|
*/ |
|
public void setData(Data report) { |
|
//создаем объект data - инициализация переменной |
|
Object[][] d = new Object[report.getUsers().size()][3 + 2*report.getQuizes().size()]; |
|
//формируем строку заголовков |
|
Object[] header = new Object[3 + 2*report.getQuizes().size()]; |
|
int i = 0; |
|
header[i] = "id"; |
|
i++; |
|
header[i] = "login"; |
|
i++; |
|
header[i] = "mail"; |
|
i++; |
|
int j = 0; |
|
while (j < report.getQuizes().size()){ |
|
header[i] = report.getQuizes().get(j).getName(); |
|
i++; |
|
header[i] = "time"; |
|
i++; |
|
j++; |
|
} |
|
//заголовки в консоль |
|
int h = 0; |
|
while (h < header.length){ |
|
System.out.println("header " + h + ": " + header[h]); |
|
h++; |
|
} |
|
//построчно заполняем модель отчета данными |
|
int userCurr = 0;//номер строки в отчете |
|
while (userCurr < report.getUsers().size()){ |
|
int col = 0;//номер столбца в строке |
|
//заполняем данные пользователя (имя и почту) |
|
d[userCurr][col] = report.getUsers().get(userCurr).getId(); |
|
col++; |
|
d[userCurr][col] = report.getUsers().get(userCurr).getLogin(); |
|
col++; |
|
d[userCurr][col] = report.getUsers().get(userCurr).getMail(); |
|
col++; |
|
//Заполняем результаты тестирвоания пользователя |
|
//Перебираем результаты, получаем результаты текущего пользователя |
|
int resultCurr = 0; |
|
while (resultCurr < report.getResults().size()){ |
|
if (report.getResults().get(resultCurr).getUserid() == report.getUsers().get(userCurr).getId()){ |
|
//если текущий результат относится к текущему пользователю |
|
//взять индекс теста из результата и сопоставить с полями заголовков (определить номер ячейки для формирования записи) |
|
String quizname = ""; |
|
int quizCurr = 0; |
|
while (quizCurr < report.getQuizes().size()){ |
|
if (report.getResults().get(resultCurr).getQuizid() == report.getQuizes().get(quizCurr).getId()){ |
|
quizname = report.getQuizes().get(quizCurr).getName(); |
|
} |
|
quizCurr++; |
|
} |
|
//поиск индекса ячейки, куда писать результаты |
|
int ihead = 0; |
|
int headerCurr = 0;//номер ячейки в которую писать результаты тестирования (+2) |
|
while (ihead < header.length){ |
|
if (quizname.equals(header[ihead])){ |
|
headerCurr = ihead; |
|
ihead++; |
|
} |
|
ihead++; |
|
} |
|
//формируем ячейку grade |
|
d[userCurr][headerCurr] = report.getResults().get(resultCurr).getGrade(); |
|
//формируем ячейку time |
|
Long time = report.getResults().get(resultCurr).getTime(); |
|
String t = LocalTime.MIN.plusSeconds(time).toString(); |
|
d[userCurr][headerCurr + 1] = t; |
|
} |
|
resultCurr++; |
|
} |
|
userCurr++; |
|
} |
|
setData(d); |
|
} |
|
/** |
|
* @return the data |
|
*/ |
|
public Object[][] getData() { |
|
return data; |
|
} |
|
public void toExcell(File file){ |
|
System.out.println("Формирование report.xlsx ..."); |
|
// создание самого excel файла в памяти |
|
XSSFWorkbook book = new XSSFWorkbook(); |
|
// создание листа |
|
XSSFSheet sheet = book.createSheet("Report"); |
|
//пишем названия тестов в заголовки xlsx |
|
int row = 0;//строка |
|
int col = 0;//столбец |
|
Row r = sheet.createRow(row); |
|
while (col < getHeader().length){ |
|
r.createCell(col).setCellValue(getHeader()[col].toString()); |
|
col++; |
|
} |
|
System.out.println("Заголовки в report.xlsx сформированы."); |
|
//построчно пишем данные |
|
System.out.println("Построчно пишем данные .... "); |
|
row++; |
|
int userCurr = 0; |
|
while (userCurr < getData().length){ |
|
col = 0; |
|
r = sheet.createRow(row); |
|
while(col < getHeader().length){ |
|
Cell c = r.createCell(col); |
|
if (getData()[userCurr][col] == null){ |
|
c.setCellValue(""); |
|
} |
|
else{ |
|
c.setCellValue(getData()[userCurr][col].toString()); |
|
} |
|
// |
|
col++; |
|
} |
|
userCurr++; |
|
row++; |
|
} |
|
//пишем книгу в файл |
|
//String location = System.getProperty("user.dir") + "\\report.xlsx"; |
|
//Path path = Paths.get(location); |
|
if (file.exists()) { |
|
try (FileOutputStream out = new FileOutputStream(file)) { |
|
book.write(out); |
|
book.close(); |
|
out.close(); |
|
System.out.println("Excel файл успешно перезаписан!"); |
|
System.out.println(file); |
|
} |
|
catch (IOException e){ |
|
e.printStackTrace(); |
|
} |
|
} |
|
else { |
|
try (FileOutputStream out = new FileOutputStream(file)) { |
|
book.write(out); |
|
book.close(); |
|
out.close(); |
|
System.out.println("Excel файл успешно создан!"); |
|
System.out.println(file); |
|
} |
|
catch (IOException e){ |
|
e.printStackTrace(); |
|
} |
|
} |
|
} |
|
/* |
|
* выводим данные модели в консоль |
|
*/ |
|
public void toConsole(){ |
|
//заголовки |
|
int i = 0; |
|
while (i < getHeader().length){ |
|
System.out.print(getHeader()[i] + " "); |
|
i++; |
|
} |
|
System.out.println(); |
|
//данные |
|
i = 0; |
|
while (i < getData().length){ |
|
int j = 0; |
|
while (j < getData()[i].length){ |
|
System.out.print(getData()[i][j] + " "); |
|
j++; |
|
} |
|
System.out.println(); |
|
i++; |
|
} |
|
System.out.println(getHeader().toString()); |
|
} |
|
/* |
|
* обновление данных отчета по данным заявки, доабвляем в отчет столбцы: |
|
* - organization/наименование организации |
|
* - object/объект строительства |
|
* - name/Фамилия Имя Отчество |
|
* - position/должность |
|
* - result/имеются или нет результаты |
|
* |
|
* данные из файла подтягиваются по полю Login, |
|
* столбцы должны быть размещены в строгой последовательности: |
|
* 1. login |
|
* 2. ... |
|
* 3. |
|
* |
|
* Лист с которого берем данные должен быть первым (желательно единственным) |
|
*/ |
|
public void updateReport(File file) throws IOException{ |
|
// создание самого excel файла в памяти |
|
XSSFWorkbook book = new XSSFWorkbook(new FileInputStream(file)); |
|
XSSFSheet sheet = book.getSheetAt(0); |
|
int height = sheet.getLastRowNum();//количество строк в таблице |
|
Row row = sheet.getRow(0); |
|
int wide = row.getLastCellNum();//количество столбцов в таблице (первые 5 столбцов должны жестко соответствовать шаблону) |
|
//перебираем строки файла |
|
int i = 0; |
|
while (i < height){ |
|
if ((String)getData()[i][1] == row.getCell(0).getStringCellValue()){ |
|
//переписываем данные строки в модель |
|
|
|
} |
|
|
|
|
|
i++; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
book.close(); |
|
} |
|
}
|
|
|