Java ilə Excel hesabatının hazırlanması

Posted on 10 Fevral 2010. Filed under: Java, JDBC, Oracle | Etiketlər: , , , , , |


Bu yazıda verilənlər bazasından məlumatları oxuyub Excel faylına yazmaq konkret bir nümunə proyekt üzərində izah edilmişdir.

İstifadə olunan proqramlar:
1.Netbeans 6.7 + Java SDK 1.6
2.Oracle 10g Express Edition Universal (UTF-8 dəstəkli)
3.Apache POİ 3.6 kitabxanası

Yazacağımız proqram aşağıda hissələrdən ibarətdir:

1.Oracle bazasına qoşulmaq
2.HR sxemasındakı bütün işçilər haqqında məlumatları oxumaq
3.İşçi məlumatlarını Excel faylına yazmaq

1-ci bənddə göstərilən Java ilə Oracle bazasına qoşulmaq barədə aşağıdakı yazılara baxın:
https://raminorucov.wordpress.com/2010/01/24/java-ile-oracle-bazasina-qosulmaq/
https://raminorucov.wordpress.com/2010/01/25/java-ile-konfiqurasiya-faylinin-istifadesi/

2-ci bənddə göstərilən Oracle bazasında işçilər haqqında məlumatı oxumaq üçün aşağıdakı yazıya baxın:
https://raminorucov.wordpress.com/2010/02/01/java-ile-oracle-bazasina-melumat-yazmaq-deyismek-ve-silmek/

3-cü bənddə göstərilən işçi məlumatlarını Excel faylına yazmaq məsələsi bu yazıda nümunə proqram üzərində göstəriləcək.

Əvvəlcə bu ünvandan Apache POİ kitabxanasını (cari versiya 3.6) yükləyin http://poi.apache.org/download.html

Netbeans-də yeni proyekt yaradın və Apache POİ-ni qlobal kitabxana kimi əlavə edin (Java ilə Oracle bazasına qoşulmaq yazısında Netbeans-ə qlobal kitabxana əlavə etmək şəkillərlə göstərilmişdir).

İşçi məlumatlarını saxlamaq və idarə etmək üçün aşağıdakı kimi Employee sinifi əlavə edin. Yazıda çox yer tutmasın deyə, get və set metodları aşağıda göstərilməyib.

public class Employee {
private long id;
private String firstName;
private String lastName;
private double salary;
private String job;
private Date hireDate;
private String department;
private String manager;
}

Daha sonra aşağıdakı kimi DbManager sinifi yaradın. Bu sinifin işi aşağıdakılardan ibarətdir:
1.Konfiqurasiya faylından(database.properties) məlumatları oxumaq
2.Oracle bazasına qoşulmaq
3.SQL sorğusu göndərmək və sorğu nəticəsini qaytarmaq
4.Oracle ilə əlaqəni kəsmək

public class DbManager {
private String url;
private String driver;
private String username;
private String password;
private Connection connection;</code>

public void connect() throws Exception {
loadConfiguration();
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
}

private void loadConfiguration() throws Exception{
Properties config = new Properties();
config.load(new FileReader("database.properties"));
url = config.getProperty("jdbc.url");
driver = config.getProperty("jdbc.driver");
username = config.getProperty("jdbc.username");
password = config.getProperty("jdbc.password");
}

public ResultSet runQuery(String sql) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sql);
return ps.executeQuery();
}

public void closeConnection() {
try {
if(connection != null &amp;&amp; !connection.isClosed()) {
connection.close();
}
} catch(SQLException sqlException) {

}
}
}

İndi isə aşağıdakı kimi EmployeeReader sinifi yaradın. Bu sinif isə aşağıdakı işləri yerinə yetirir:
1.SQL sorğusunu fayldan oxumaq
2.DbManager sinifindən olan obyektin köməyi ilə Oracle bazaya qoşulmaq
3.İşçiləri oxuyun Employee obyektinə çevirmək və siyahıya əlavə etmək
4.Baza ilə əlaqəni kəsmək
5.İşçilərin siyahısını qaytarmaq

public class EmployeeReader {</code>

private String readSql() throws Exception {
StringBuilder sql = new StringBuilder();
String line = "";
BufferedReader reader = new BufferedReader(new FileReader("EmployeeReport.sql"));
while((line = reader.readLine()) != null) {
sql.append(line + " ");
}
return sql.toString();
}

public List getEmployeeList() {
List employeeList = new ArrayList();
DbManager dbManager = new DbManager();
try {
String sql = readSql();
System.out.println("SQL = " + sql);
dbManager.connect();
ResultSet resultSet = dbManager.runQuery(sql);
while(resultSet.next()) {
Employee employee = new Employee();
employee.setId(resultSet.getLong("employee_id"));
employee.setFirstName(resultSet.getString("first_name"));
employee.setLastName(resultSet.getString("last_name"));
employee.setJob(resultSet.getString("job_id"));
employee.setHireDate(new java.util.Date(resultSet.getDate("hire_date").getTime()));
employee.setSalary(resultSet.getDouble("salary"));
employee.setDepartment(resultSet.getString("department_name"));
employee.setManager(resultSet.getString("manager"));
employeeList.add(employee);
//System.out.println(employee);
}
} catch(Exception exception) {
exception.printStackTrace();
} finally {
dbManager.closeConnection();
}
return employeeList;
}
}

SQL select sorğusu EmployeeReport.sql faylında yerləşir və aşağıdakı kimidir:

SELECT   E.EMPLOYEE_ID,
E.FIRST_NAME,
E.LAST_NAME,
E.JOB_ID,
E.HIRE_DATE,
E.SALARY,
D.DEPARTMENT_NAME,
M.FIRST_NAME || ' ' || M.LAST_NAME MANAGER
FROM         hr.employees e
LEFT JOIN
hr.departments d
ON e.department_id = D.DEPARTMENT_ID
LEFT JOIN
hr.employees m
ON E.MANAGER_ID = M.EMPLOYEE_ID
ORDER BY   d.department_name, e.first_name, e.last_name

SQL sorğusunu proqram kodunda deyil, ayrıca faylda saxlamağın aşağıdakı faydalaları var:
1.Gələcəkdə sütün adlarını eyni saxlamaq şərti ilə, SQL sorğusunu daha da optimallaşdırmaq olar, bu halda dəyişiklik ancaq bir faylda olacaq, proqram heç bir dəyişiklik olmadan işləməyə davam edəcək, əks halda isə proqram kodunda həmin SQL sorğusunu tapmaq, dəyişmək, proyekti kompilyasiya etmək və serverə yenidən deploy etmək lazımdır.
2.SQL sorğusunu Java kodunda yerləşdirmək üçün çoxlu + işarələri lazımdır, SQL kodunu vizual olaraq görmək və oxumaq çətin olur, sorğunu dəyişdirərkən səhv etmə ehtimalı var (xüsusilə SQL sorğusunda , (, ) işarələri olduqda səhv etmə ehtimalı daha yüksəkdir, bir dəfə başıma gəlib🙂 )

İndi isə ReportManager sinifi əlavə edin. Kod nisbətən çox olduğuna görə hissə hissə göstərib iş prinsipini izah edəcəm.
Bu sinifin işi aşağıdakılardan ibarətdir:
1.Excel hesabatının başlıq sətrini hazırlamaq (şrift və s. özəllikləri hazırlamaq, sütün adlarını yazmaq)
2.Hesabatın sütünlarını hazırlamaq (şrift və s. özəllikləri hazırlamaq, xanalara məlumat yazmaq)
3.Yekun hesabatı Excel faylı olaraq yaddaşa yazmaq

Aşağıdakı kod fraqmentlərinə baxaq.

private List employeeList;
public void setEmployeeList(List employeeList) {
this.employeeList = employeeList;
}

İşçilərin siyahısı employeeList siyahısında saxlanılır və kənardan verilir.

Yeni Excel sənədi (workbook) və onun içərisində yeni səhifə(sheet ) yaradırıq.

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Employees");

Yeni stil və font obyekti yaradırıq, font stilini bold olaraq təyin edirik. Bu stil sütün başlıqları üçün istifadə olunacaq.

HSSFCellStyle titleStyle = createTitleStyle(workbook);
private HSSFCellStyle createTitleStyle(HSSFWorkbook workbook) {
HSSFCellStyle titleStyle = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
titleStyle.setFont(font);
return titleStyle;
}

Başlıq sətrinin sütün adlarını yazırıq.

HSSFRow titleRow = createTitleRow(sheet);
private HSSFRow createTitleRow(HSSFSheet sheet) {
HSSFRow titleRow = sheet.createRow(0);
titleRow.createCell(0).setCellValue("Employee id");
titleRow.createCell(1).setCellValue("First name");
titleRow.createCell(2).setCellValue("Last name");
titleRow.createCell(3).setCellValue("Job");
titleRow.createCell(4).setCellValue("Hire date");
titleRow.createCell(5).setCellValue("Salary");
titleRow.createCell(6).setCellValue("Department");
titleRow.createCell(7).setCellValue("Manager");
return titleRow;
}

Başlıq sətrindəki sütün adlarına stil veririk.

for(int i=0;i&lt;titleRow.getPhysicalNumberOfCells();i++) {
titleRow.getCell(i).setCellStyle(titleStyle);
}

İşə qəbul olma tarixini gün.ay.il (05.10.2010) formatında yazmaq üçün yeni stil yaradırıq.

HSSFCellStyle dateStyle = createDateStyle(workbook);
private HSSFCellStyle createDateStyle(HSSFWorkbook workbook) {
HSSFCellStyle dateStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd.mm.yyyy"));
return dateStyle;
}

İşçi məlumatlarını sütunlara yazırıq, tarix üçün xüsusi stil tətbiq edirik.

writeReportData(sheet, dateStyle);
private void writeReportData(HSSFSheet sheet, HSSFCellStyle dateStyle) {
for (int i = 0; i < employeeList.size(); i++) {
Employee employee = employeeList.get(i);
HSSFRow dataRow = sheet.createRow(i + 1);
dataRow.createCell(0).setCellValue(employee.getId());
dataRow.createCell(1).setCellValue(employee.getFirstName());
dataRow.createCell(2).setCellValue(employee.getLastName());
dataRow.createCell(3).setCellValue(employee.getJob());
dataRow.createCell(4).setCellValue(employee.getHireDate());
dataRow.getCell(4).setCellStyle(dateStyle);
dataRow.createCell(5).setCellValue(employee.getSalary());
dataRow.createCell(6).setCellValue(employee.getDepartment());
dataRow.createCell(7).setCellValue(employee.getManager());
}
}

Nəhayət ki, hazır Excel sənədini fayla yazırıq🙂

FileOutputStream fileOut = new FileOutputStream(reportFile);
workbook.write(fileOut);
fileOut.close();

Bütün bu əməliyyatlar uyğun ardıcıllıqla ReportManager sinifindəki createExcelReport metodunda çağırılır.

public String createExcelReport() throws Exception {
String reportFile = "employee-report.xls";</code>

// create Excel workbook and sheet
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Employees");

HSSFCellStyle titleStyle = createTitleStyle(workbook);
HSSFRow titleRow = createTitleRow(sheet);

HSSFCellStyle dateStyle = createDateStyle(workbook);
// Set column styles to bold
for(int i=0;i&lt;titleRow.getPhysicalNumberOfCells();i++) {
titleRow.getCell(i).setCellStyle(titleStyle);
}

// Write data
System.out.println("Number of rows = " + employeeList.size());
writeReportData(sheet, dateStyle);
autoSizeColumnWidth(titleRow, sheet);

// write to excel file
FileOutputStream fileOut = new FileOutputStream(reportFile);
workbook.write(fileOut);
fileOut.close();

return reportFile;
}

Proyektin Main sinifindəki main metodu isə aşağıkı kimidir

public static void main(String[] args) throws Exception {
EmployeeReader employeeReader = new EmployeeReader();
ReportManager reportManager = new ReportManager();
reportManager.setEmployeeList(employeeReader.getEmployeeList());
String file = reportManager.createExcelReport();
System.out.println("Report file " + file);
}

Proqram kodu nisbətən uzundur, proyektin tam versiyasını aşağıdakı linklərdən yükləyin və yaxşıca analiz edin:
1.Boxca.com-da JavaExcelDemo proyekti
2.JavaExcelDemo proyekti (faylın adını .zip olaraq dəyişin)

Apache POI-HSSF siniflərini ilə Excel 2003 (*.xls), POI-XSSF sinifləri isə Excel 2007 (*.xlsx) faylları hazırlamaq mümkündür.

Apache POİ kitabxanasının imkanları daha çoxdur, Microsoft Word, Excel, Powerpoint, Outlook, Publisher, Visio və s. proqramların yaratdığı faylları emal etmək mümkündür.

Sual və təklifləriniz(yazını təkmilləşdirmək, maraqlandığınız mövzuda yazı təklifi və s.) üçün şərh yazın.
Uğurlar!

Make a Comment

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

8 Cavab to “Java ilə Excel hesabatının hazırlanması”

RSS Feed for Ramin Orucovun Java və Oracle bloqu Comments RSS Feed

Java da ishlemesem de, +1🙂

Təşəkkür🙂

Super… Azerbaycanin senin kimi ki ogullari var, her shey yaxshi olacag inshallah😉

Sag ol Araz🙂

Eladi m. facebookda gormusdum amma açıb baxmaga imkan olmamisdi.:)

Salam Ramin bey, men de Java uzre hazirlashib sertifikat almaq fikirindeyem.
Zehmet olmasa mene oz komekliyinizi gosteresiniz.

Xaliq Qanbarov
xaliqq@yahoo.com

Salam. Göstərdiyiniz email adresinə ətraflı məlumat yazacam.

İnanirsan Ramin butun interneti elek velek eledim. ingilis dilinde rus dilinde amma bir şey tapa bilmedim excelle export haqqinda. Tesadufən burda rast gəldim. Respect !!


Where's The Comment Form?

    Haqqında

    Java ilə obyekt yönlü proqramlaşdırma, Java web proqramlaşdırma, Oracle SQL, PL/SQL proqramlaşdırma, optimallaşdırma

    RSS

    Subscribe Via RSS

    • Subscribe with Bloglines
    • Add your feed to Newsburst from CNET News.com
    • Subscribe in Google Reader
    • Add to My Yahoo!
    • Subscribe in NewsGator Online
    • The latest comments to all posts in RSS

    Meta

Liked it here?
Why not try sites on the blogroll...

%d bloqqer bunu bəyənir: