עבודה עם Microsoft Excel בג'אווה

1.מבוא

במדריך זה נדגים את השימוש ב- ממשקי API של Apache POI ו- JExcel לעבודה עם גיליונות אלקטרוניים של Excel.

ניתן להשתמש בשתי הספריות כדי לקרוא, לכתוב ולשנות באופן דינמי את התוכן של גיליון אלקטרוני של Excel ולספק דרך יעילה לשילוב של Microsoft Excel ביישום Java.

2. תלות Maven

כדי להתחיל, נצטרך להוסיף את התלות הבאות שלנו pom.xml קוֹבֶץ:

 org.apache.poi poi 3.15 org.apache.poi poi-ooxml 3.15 

את הגרסאות העדכניות ביותר של poi-ooxml ו- jxls-jexcel ניתן להוריד מ Maven Central.

3. נקודת עניין של אפאצ'י

ה ספריית נקודות עניין של אפאצ'י תומכת בשניהם .xls ו .xlsx קבצים והיא ספרייה מורכבת יותר מספריות Java אחרות לעבודה עם קבצי Excel.

זה מספק את חוברת עבודה ממשק לדוגמנות לְהִצטַיֵן קובץ, ואת דַף, שׁוּרָה, ו תָא ממשקים המדגמים את האלמנטים של קובץ אקסל, כמו גם יישומים של כל ממשק לשני פורמטים של קבצים.

כשעובדים עם החדש יותר .xlsx בפורמט הקובץ, היית משתמש ב- XSSFWorkbook, XSSFSheet, XSSFRow ו- XSSFCell שיעורים.

לעבוד עם המבוגרים .xls פורמט, השתמש ב- HSSF Workbook, HSSFSheet, HSSFRow, ו HSSFCell שיעורים.

3.1. קריאה מ- Excel

בואו ניצור שיטה שפותחת א .xlsx ואז קורא תוכן מהגיליון הראשון של הקובץ.

השיטה לקריאת תוכן התא משתנה בהתאם לסוג הנתונים בתא. ניתן לקבוע את סוג תוכן התא באמצעות ה- getCellTypeEnum () שיטת ה- תָא מִמְשָׁק.

ראשית, בואו נפתח את הקובץ ממיקום נתון:

קובץ FileInputStream = FileInputStream חדש (קובץ חדש (fileLocation)); חוברת עבודה חוברת עבודה = XSSFWorkbook חדש (קובץ);

לאחר מכן, בואו נאחזר את הגיליון הראשון של הקובץ ונחזור דרך כל שורה:

גיליון גיליון = חוברת עבודה. GetSheetAt (0); מַפָּה נתונים = HashMap חדש (); int i = 0; עבור (שורה שורה: גיליון) {data.put (i, ArrayList חדש ()); עבור (תא תא: שורה) {מתג (cell.getCellTypeEnum ()) {מקרה STRING: ... הפסקה; מקרה מספר: ... הפסקה; מקרה בוליאן: ... הפסקה; מקרה פורמולה: ... הפסקה; ברירת מחדל: data.get (מספר שלם חדש (i)). הוסף (""); }} i ++; }

ל- POI יש שיטות שונות לקריאת כל סוג נתונים. בואו נרחיב על התוכן של כל מקרה מתג לעיל.

כאשר ערך התא סוג enum הוא חוּט, התוכן יקרא באמצעות getRichStringCellValue () שיטה של תָא מִמְשָׁק:

data.get (מספר שלם חדש (i)). הוסף (cell.getRichStringCellValue (). getString ());

תאים שיש להם מספרי סוג התוכן יכול להכיל תאריך או מספר ונקרא באופן הבא:

אם (DateUtil.isCellDateFormatted (cell)) {data.get (i) .add (cell.getDateCellValue () + ""); } אחר {data.get (i) .add (cell.getNumericCellValue () + ""); }

ל בוליאן ערכים, יש לנו את getBooleanCellValue () שיטה:

data.get (i) .add (cell.getBooleanCellValue () + "");

וכאשר סוג התא הוא נוּסחָה, אנחנו יכולים להשתמש ב- getCellFormula () שיטה:

data.get (i) .add (cell.getCellFormula () + "");

3.2. כתיבה לאקסל

נקודת עניין של אפאצ'י משתמשת באותם ממשקים שהוצגו בסעיף הקודם לכתיבה לקובץ אקסל ותומכת בעיצוב טוב יותר מאשר ב- JExcel.

בואו ניצור שיטה שכותבת רשימת אנשים לגיליון שכותרתו "אנשים". ראשית, ניצור ונעצב שורה של כותרת המכילה "שֵׁם" ו "גיל" תאים:

חוברת עבודה חוברת עבודה = XSSFWorkbook חדש (); גיליון גיליון = workbook.createSheet ("אנשים"); sheet.setColumnWidth (0, 6000); sheet.setColumnWidth (1, 4000); כותרת שורה = גיליון.קראייט (0); CellStyle headerStyle = workbook.createCellStyle (); headerStyle.setFillForegroundColor (IndexedColors.LIGHT_BLUE.getIndex ()); headerStyle.setFillPattern (FillPatternType.SOLID_FOREGROUND); XSSFFont גופן = ((XSSFWorkbook) חוברת עבודה) .createFont (); font.setFontName ("Arial"); font.setFontHeightInPoints ((קצר) 16); font.setBold (נכון); headerStyle.setFont (גופן); תא headerCell = header.createCell (0); headerCell.setCellValue ("שם"); headerCell.setCellStyle (headerStyle); headerCell = header.createCell (1); headerCell.setCellValue ("גיל"); headerCell.setCellStyle (headerStyle);

לאחר מכן, בואו נכתוב את תוכן הטבלה בסגנון שונה:

סגנון CellStyle = workbook.createCellStyle (); style.setWrapText (נכון); שורה שורה = גיליון.קראייט (2); תא תא = row.createCell (0); cell.setCellValue ("ג'ון סמית"); cell.setCellStyle (סגנון); תא = row.createCell (1); cell.setCellValue (20); cell.setCellStyle (סגנון);

לסיום, בואו נכתוב את התוכן ל- a 'Temp.xlsx' הקובץ בספריה הנוכחית וסגור את חוברת העבודה:

קובץ currDir = קובץ חדש ("."); נתיב מחרוזת = currDir.getAbsolutePath (); מחרוזת fileLocation = path.substring (0, path.length () - 1) + "temp.xlsx"; FileOutputStream outputStream = FileOutputStream חדש (fileLocation); workbook.write (outputStream); workbook.close ();

בואו נבדוק את השיטות לעיל ב- a JUnit מבחן שכותב תוכן ל- temp.xlsx לאחר מכן הקובץ קורא את אותו הקובץ כדי לאמת שהוא מכיל את הטקסט שכתבנו:

מחלקה ציבורית ExcelTest {ExcelPOIHelper פרטי excelPOIHelper; מחרוזת סטטית פרטית FILE_NAME = "temp.xlsx"; קובץ מחרוזת פרטי @ לפני הריק הציבורי generereExcelFile () זורק IOException {File currDir = קובץ חדש ("."); נתיב מחרוזת = currDir.getAbsolutePath (); fileLocation = path.substring (0, path.length () - 1) + FILE_NAME; excelPOIHelper = ExcelPOIHelper חדש (); excelPOIHelper.writeExcel (); } @Test ציבורי בטל כאשר ParsingPOIExcelFile_thenCorrect () זורק IOException {Map נתונים = excelPOIHelper.readExcel (fileLocation); assertEquals ("שם", data.get (0) .get (0)); assertEquals ("גיל", data.get (0) .get (1)); assertEquals ("ג'ון סמית ', data.get (1). get (0)); assertEquals ("20", data.get (1) .get (1)); }}

4. JExcel

ספריית JExcel היא ספרייה קלה עם יתרון בכך שהיא קלה יותר לשימוש מאשר נקודת עניין של אפאצ'י, אך עם החיסרון שהיא רק מספקת תמיכה בעיבוד קבצי Excel ב- .xls (1997-2003) פורמט.

כרגע, .xlsx קבצים אינם נתמכים.

4.1. קריאה מ- Excel

על מנת לעבוד עם קבצי Excel, ספרייה זו מספקת סדרה של שיעורים המייצגים את החלקים השונים של קובץ Excel. ה חוברת עבודה מחלקה מייצגת את כל אוסף הגיליונות. ה דַף class מייצג גיליון יחיד, ו- תָא class מייצג תא בודד של גיליון אלקטרוני.

בואו נכתוב שיטה שיוצרת חוברת עבודה מקובץ Excel שצוין, מקבל את הגיליון הראשון של הקובץ, ואז חוצה את תוכנו ומוסיף כל שורה ב מפת גיבוב:

מחלקה ציבורית JExcelHelper {מפה ציבורית readJExcel (מחרוזת fileLocation) זורק IOException, BiffException {Map נתונים = HashMap חדש (); חוברת עבודה חוברת עבודה = Workbook.getWorkbook (קובץ חדש (fileLocation)); גיליון גיליון = חוברת עבודה. GetSheet (0); שורות int = sheet.getRows (); עמודות int = sheet.getColumns (); עבור (int i = 0; i <שורות; i ++) {data.put (i, ArrayList חדש ()); עבור (int j = 0; j <column; j ++) {data.get (i) .add (sheet.getCell (j, i) .getContents ()); }} להחזיר נתונים; }}

4.2. כתיבה לאקסל

לכתיבה לקובץ Excel, ספריית JExcel מציעה שיעורים דומים לאלה המשמשים לעיל, המדגמים קובץ גיליון אלקטרוני: WritableWorkbook, WritableSheet, ו WritableCell.

ה WritableCell בכיתה יש מחלקות משנה המתאימות לסוגי התוכן השונים שניתן לכתוב: תווית, תאריך שעה, מספר, בוליאני, רֵיק, ו נוּסחָה.

ספרייה זו מספקת תמיכה גם בעיצוב בסיסי, כגון שליטה בגופן, צבע ורוחב התא.

בואו נכתוב שיטה שיוצרת חוברת עבודה בשם 'Temp.xls' בספרייה הנוכחית, ואז כותב את אותו התוכן שכתבנו במקטע ה- IP של אפאצ'י.

ראשית, בואו ניצור את חוברת העבודה:

קובץ currDir = קובץ חדש ("."); נתיב מחרוזת = currDir.getAbsolutePath (); מחרוזת fileLocation = path.substring (0, path.length () - 1) + "temp.xls"; WritableWorkbook חוברת עבודה = Workbook.createWorkbook (קובץ חדש (fileLocation));

לאחר מכן, בואו ניצור את הגיליון הראשון ונכתוב את הכותרת של קובץ ה- Excel המכילה "שֵׁם" ו "גיל" תאים:

גיליון WritableSheet = workbook.createSheet ("גיליון 1", 0); WritableCellFormat headerFormat = WritableCellFormat חדש (); WritableFont font = new WritableFont (WritableFont.ARIAL, 16, WritableFont.BOLD); headerFormat.setFont (גופן); headerFormat.setBackground (צבע.LIGHT_BLUE); headerFormat.setWrap (נכון); תווית headerLabel = תווית חדשה (0, 0, "שם", headerFormat); sheet.setColumnView (0, 60); sheet.addCell (headerLabel); headerLabel = תווית חדשה (1, 0, "גיל", headerFormat); sheet.setColumnView (0, 40); sheet.addCell (headerLabel);

עם סגנון חדש, בואו נכתוב את תוכן הטבלה שיצרנו:

WritableCellFormat cellFormat = WritableCellFormat חדש (); cellFormat.setWrap (נכון); תווית cellLabel = תווית חדשה (0, 2, "ג'ון סמית", cellFormat); sheet.addCell (cellLabel); מספר cellNumber = מספר חדש (1, 2, 20, cellFormat); sheet.addCell (cellNumber);

חשוב מאוד לזכור לכתוב לקובץ ולסגור אותו בסוף, כך שהוא יכול לשמש תהליכים אחרים, באמצעות ה- לִכתוֹב() ו סגור() שיטות של חוברת עבודה מעמד:

workbook.write (); workbook.close ();

5.סיכום

מדריך זה המחיש כיצד להשתמש ב- נקודת עניין של אפאצ'י ממשק API ו- JExcel ממשק API לקריאה וכתיבה של קובץ Excel מתוכנת Java.

קוד המקור השלם למאמר זה נמצא בפרויקט GitHub.


$config[zx-auto] not found$config[zx-overlay] not found