From 7debe765b32b2dd635f59158bd2b783f32a01eb7 Mon Sep 17 00:00:00 2001 From: esoe Date: Fri, 10 Jun 2022 14:32:20 +0300 Subject: [PATCH] create excell works --- pom.xml | 35 ++++++++ report.xlsx | Bin 0 -> 7571 bytes src/main/java/ru/egspt/DataPane.java | 3 +- src/main/java/ru/egspt/ReportControls.java | 12 +++ src/main/java/ru/egspt/ReportPane.java | 21 ++++- src/main/java/ru/egspt/ReportTableModel.java | 79 ++++++++++++++++++ target/classes/ru/egspt/DataPane.class | Bin 4823 -> 4847 bytes target/classes/ru/egspt/ReportControls.class | Bin 0 -> 980 bytes target/classes/ru/egspt/ReportPane.class | Bin 4758 -> 6267 bytes .../classes/ru/egspt/ReportTableModel.class | Bin 5023 -> 7843 bytes 10 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 report.xlsx create mode 100644 src/main/java/ru/egspt/ReportControls.java create mode 100644 target/classes/ru/egspt/ReportControls.class diff --git a/pom.xml b/pom.xml index 2b8382d..13cf78e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,41 @@ 5 + + org.apache.poi + poi + 5.2.2 + + + org.apache.poi + poi-ooxml + 5.2.2 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + + org.apache.poi + poi-scratchpad + 5.2.2 + + + org.apache.poi + ooxml-schemas + 1.1 + + + org.apache.logging.log4j + log4j-to-slf4j + 2.8.2 + + + org.apache.cassandra + cassandra-all + 4.0.3 + mysql mysql-connector-java diff --git a/report.xlsx b/report.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b896e3254fe77fb2b42265cf603bc184cfdd8782 GIT binary patch literal 7571 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 oKjZvf6n6yamysiP ReportControls.getExcellReport(app)); + implantDataButton.setText("implant data"); + implantDataButton.addActionListener(e -> ReportControls.implantData(app)); + + reportControlsPane.add(getExcellReportButton); + reportControlsPane.add(implantDataButton); + TitledBorder border = new TitledBorder(new LineBorder(Color.black), "report-controls-pane", TitledBorder.CENTER, TitledBorder.CENTER); + reportControlsPane.setBorder(border); + reportControlsPane.setVisible(true); + + } public void setupReportTablePane(Data report){ reportTableModel = new ReportTableModel(report); reportTable = new JTable(reportTableModel); diff --git a/src/main/java/ru/egspt/ReportTableModel.java b/src/main/java/ru/egspt/ReportTableModel.java index ce7e794..84ed026 100644 --- a/src/main/java/ru/egspt/ReportTableModel.java +++ b/src/main/java/ru/egspt/ReportTableModel.java @@ -1,9 +1,19 @@ package ru.egspt; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; 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; @@ -172,6 +182,75 @@ public class ReportTableModel extends AbstractTableModel{ public Object[][] getData() { return data; } + public void toExcell(){ + 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 (Files.exists(path)) { + try (FileOutputStream out = new FileOutputStream(location)) { + book.write(out); + book.close(); + out.close(); + System.out.println("Excel файл успешно перезаписан!"); + System.out.println(location); + } + catch (IOException e){ + e.printStackTrace(); + } + } + else { + try (FileOutputStream out = new FileOutputStream(new File(location))) { + book.write(out); + book.close(); + out.close(); + System.out.println("Excel файл успешно создан!"); + System.out.println(location); + } + catch (IOException e){ + e.printStackTrace(); + } + } + } + /* + * выводим данные модели в консоль + */ public void toConsole(){ //заголовки int i = 0; diff --git a/target/classes/ru/egspt/DataPane.class b/target/classes/ru/egspt/DataPane.class index 4c9c13a888c5bf7d507bb6a8ce809961fd94e310..639ab9e40670dc4b308ed69908737b8de8609fd2 100644 GIT binary patch delta 1750 zcmb`HX>e0j6vzKJY4Vack2a08n3`gy9h}k-A_XH9DAdX**rF^VDIGCF3`Ul|8L#f}KH*@FSd(Quydw%cS zdwRxiGsKa zWv2TiOhK-QDE3O&hb|t~FEZ}O0|L4kN_daHL?_`v9N>TG=TgvzB|L&hxl_2vco2^Z z=wT=(r($wCgeQ2bU@wW{DG5*G8HQY+H(V2FjNI(62}Jy125s5Qelp0#_vV>RA$E^lCJHoFtT$OW-!NTj9rA|ZwZALJ>CgD6xRcEhD$WsrUz;X3F zZ!#2=&D>DC&2x*#+34~6oNL0tt$yD^1KwuPuZnEl=?w{ZhoOketf*SVP&(oX2?Z!r zBfclWq(&UVaRc6G5LSCbk;ZU{!5H#}(-B1S`$)pa_=K-F&Nn15D&aFCe86bee<|TB zoZ%;ouA*j)GKi$ggivMQN%$T=aEn-}9m435bz)p&+ygx{^w*d0!YMAf{3xti1v~p` zM}s*u7Lgs81qlwEkJ}K^ASXdaxu)uB{W(9RzWdzWbG+W zqSdK)Ye4RR>gfE$E74#>u-kn6f`!E{fxY2xA zr;Ec^nWOqxaunRw&#Q9tWEcI_OEDb_U_&KJu@H;sTSD^{RCPVgwqPlCpc*Z>4Be=~ zL0q0A`sJr~Sd+>>XMmlKB-#G#hX zUq>8P5{0X&qB`1LMU|{34r{1}wdlaL=)$@z27H_WA7>C6XRsi{pyR(7R8i}6nauJ~ z2E)5C43A+LPGJ}s!!VMKVOYV*Yz$<~!Z4DB!Fd)2=cE`;@qH$nyn!$@5Qggs!$!hz z17Yw`Q5y-vCc?0pFn9^WO@zTm7`FU>7(T#m%t~D$YBo*kq8ZB-d`J!b>AyErOc}Pp zfbF~?-{Lw=O~mjyY0s5@LDH`$O8q1aWJ$l7RQfGRf1D`YLDHZqot@4~uTLhcGj$3; xN4KlJk6JwaoakvAxRqC%3(DvTo5XowqVuklGd*0BI1f*BZdILypHlgL{s*2(k^lez delta 1626 zcmai!`EyfM6vw|ewQuvb4FTzDDU>?3F~owDrBtoZaiKDRbu<;xR$@i5v`y-aVTnp> zt=6rVx_}}mt1AWaQg{|ntF?940-`LgKg%EBcHT=Ok4$EqH*@FQch33V^SSrj`$x%% z5^ePFLx%xeh2Q(N-t_E?=dW%Kwyj>ZxS`pvAq@}6Si_Jb&Z#*IG^|5d#(DXsIcNAM_v+~f}~Xb3hij4Qpo_P+r0SEYs!HgII4L*z@j>f;>a;F9r#sFJdk zE<9hg8OYSog=aaQ!}DUJG*1=ild+LuifE9s#W^V>?FGEpE6-3uc$s4p zHj7I6GWAuwCSwc3rST{!ontGui5}TaYrMg+9XrGkIhXAcC*=ZVC-#`jzA65aifV}?8tW_i^bhGNN|a$JImX7VV9(@Y-1Q3YSno-OqU+E)bw3~In1j45ao_cg~i z_*Se?XDb63<2Xhew_SBhCpmt=kK&kGkr%=kgGO0#2{Y|1$4~fKlxTC)hA_6jQHwg% zHIU$-1D++OWK_)RC(D6y8Yd#1#w)<#K@O(T=S2ms#B|GNWnc!i1<0d{%^8!zA)i~v z+9)22ptHC^F2!E_z3bU0W+%=!AZe@+?L zX=e5~CpZhE*u98sw}Bd86xZu`%ba<11aC79TJLRFt&Y70ZufBm^}c;r7Dc10U({q4 z&74UmQGr6tMiJ(q7;`ZXmAHoNn^1*%T#fr^){1Mf9@Xf>b=ZRWVpHbi{QWpU+fa`h zM4(fb_d!D&0=NiKaXfQscp#2?C;}saYFMa)3DiM5s-feE9hICm)Il4n=K@rZ$5j`{ zv(bGh9?mK%zk%p(B)Ww}S4(s^6Wt=>sU^C_RQnR5TS`^mf^O8I7q^Phtn*}Z;$+=6 zGRZkLJQOGUB!b}t*|0@6k{}zglMUWOlB(i&mYz2||iR@k?Yck2gi8D(`4QceM?2Iam9tKiD9EoXz^1{}EX z0z3w-M5vI+18{O)2r(OnEEJHq%zAfbfAgQ2^|$X|h5&Bij)575LezIerx!|RSA;<% zw*p^Af!8yTVp!VaFSz4zzvDbvkYbFW|wfIB)H9j1@ix0`Z zj)(C<{E<$E#nBtu?2q1$-jeH6@rayawOX~XicO6zh2>MZ5Jap9?%O|D&e7sdP4XlH7&{GFlrd}smgLV$BjMjAJ zGt7PZn1MxBxmD;qSvv`!b%AynWU)vm>hd;4tGN6DmU71jI8hnk%mC*HsAyDnoHq@V rpgFpxk$K8~ZH&A=MQ%=z8HKz-NDZ>crShAE(2&do!sstn>Tmx57N7$V literal 0 HcmV?d00001 diff --git a/target/classes/ru/egspt/ReportPane.class b/target/classes/ru/egspt/ReportPane.class index 9c4a3da5edf6b1a1961f7d3ff00e17ce209b9b7e..26da321b7e20b86674523ba3deed280bc5029046 100644 GIT binary patch literal 6267 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 QmvK+75|^tcwH%ZF2Y=&f$p8QV literal 4758 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