天天看點

poi對Excel檔案的編輯

這個是官方網站上給出的一個,我做了一些修改,

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * 
 * 這個不是HSSF FILE的大部分,隻是一個功能測試程式,這個程式
 * 
 * 包含簡單API功能,對于初學者可能有所幫助
 * 
 * @see #main
 * @author Andrew Oliver (acoliver at apache dot org)
 */
public final class HSSFReadWrite
{

	/**
	 * 
	 * 根據傳入的檔案名,讀取為HSSFWrokbook
	 */
	private static HSSFWorkbook readFile(String filename) throws IOException
	{
		return new HSSFWorkbook(new FileInputStream(filename));
	}

	/**
	 * 
	 * 給定檔案名,建立一個簡單的sheet
	 */
	private static void testCreateSampleSheet(String outputFilename)
			throws IOException
	{
		int rownum;
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet s = wb.createSheet();
		HSSFCellStyle cs = wb.createCellStyle();
		HSSFCellStyle cs2 = wb.createCellStyle();
		HSSFCellStyle cs3 = wb.createCellStyle();
		HSSFFont f = wb.createFont();
		HSSFFont f2 = wb.createFont();

		f.setFontHeightInPoints((short) 12);
		f.setColor((short) 0xA);
		f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		f2.setFontHeightInPoints((short) 10);
		f2.setColor((short) 0xf);
		f2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		cs.setFont(f);
		cs.setDataFormat(HSSFDataFormat
				.getBuiltinFormat("($#,##0_);[Red]($#,##0)"));
		cs2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		cs2.setFillPattern((short) 1); // fill w fg
		cs2.setFillForegroundColor((short) 0xA);
		cs2.setFont(f2);
		wb.setSheetName(0, "HSSF Test");
		for (rownum = 0; rownum < 300; rownum++)
		{
			HSSFRow r = s.createRow(rownum);
			if ((rownum % 2) == 0)
			{
				r.setHeight((short) 0x249);
			}

			for (int cellnum = 0; cellnum < 50; cellnum += 2)
			{
				HSSFCell c = r.createCell(cellnum);
				c.setCellValue(rownum
						* 10000
						+ cellnum
						+ (((double) rownum / 1000) + ((double) cellnum / 10000)));
				if ((rownum % 2) == 0)
				{
					c.setCellStyle(cs);
				}
				c = r.createCell(cellnum + 1);
				c.setCellValue(new HSSFRichTextString("TEST"));
				s.setColumnWidth(cellnum + 1, (int) (50 * 8 / 0.05));
				if ((rownum % 2) == 0)
				{
					c.setCellStyle(cs2);
				}
			}
		}

		// 在底部畫黑線
		rownum++;
		rownum++;
		HSSFRow r = s.createRow(rownum);
		cs3.setBorderBottom(HSSFCellStyle.BORDER_THICK);
		for (int cellnum = 0; cellnum < 50; cellnum++)
		{
			HSSFCell c = r.createCell(cellnum);
			c.setCellStyle(cs3);
		}
		s.addMergedRegion(new CellRangeAddress(0, 3, 0, 3));
		s.addMergedRegion(new CellRangeAddress(100, 110, 100, 110));

		FileOutputStream out = new FileOutputStream(outputFilename);
		wb.write(out);
		out.close();
	}

	/**
	 * main 方法
	 * 
	 * 1. 給定一個參數作為Excel檔案名,在操作台輸出 <br/>
	 * 
	 * 2. 給定兩個參數,第二個參數為write時,根據第一個參數建立一個相應名字的Excel,
	 * 第二個參數不為Write時,把第一個參數的Excel複制到第二個參數的Excel <br/>
	 * 
	 * 3. 給定三個參數,當第三個參數為 modify1 時,将第一個參數對應的Excel拷貝到<br/>
	 * 參數2對應的Excel中,再進行編輯 <br/>
	 * 
	 */
	public static void main(String[] args)
	{
		if (args.length < 1)
		{
			System.err.println("At least one argument expected");
			return;
		}
		System.out.println(args.length);

		String fileName = args[0];
		try
		{
			// 有兩個參數的時候
			if (args.length < 2)
			{

				// 讀取表
				HSSFWorkbook wb = HSSFReadWrite.readFile(fileName);

				System.out.println("Data dump:\n");

				// 周遊所有的sheet
				for (int k = 0; k < wb.getNumberOfSheets(); k++)
				{
					// 擷取目前的sheet
					HSSFSheet sheet = wb.getSheetAt(k);
					// 擷取相應的sheet的行數
					int rows = sheet.getPhysicalNumberOfRows();

					System.out.println("Sheet " + k + " \""
							+ wb.getSheetName(k) + "\" has " + rows
							+ " row(s).");
					// 周遊每一行的資料
					// for (int r = 0; r < rows; r++) {
					// //擷取行
					// HSSFRow row = sheet.getRow(r);
					// if (row == null) {
					// continue;
					// }
					//
					// //擷取目前行的列數
					//
					// int cells = row.getPhysicalNumberOfCells();
					// System.out.println("\nROW " + row.getRowNum() + " has " +
					// cells
					// + " cell(s).");
					// for (int c = 0; c < cells; c++) {
					// HSSFCell cell = row.getCell(c);
					// String value = null;
					for (Row row : sheet)
					{
						int cells = row.getLastCellNum();
						System.out.println("\nROW " + row.getRowNum() + " has "
								+ cells + " cell(s).");
						for (Cell cell : row)
						{

							String value = null;
							if (cell == null)
								System.out.print("-------null\t");
							else if (cell.getCellType() == HSSFCell.CELL_TYPE_BLANK)
								System.out.print("空");
							else
							{
								switch (cell.getCellType())
								{

									case HSSFCell.CELL_TYPE_FORMULA:
										value = "FORMULA value="
												+ cell.getCellFormula();
										break;

									case HSSFCell.CELL_TYPE_NUMERIC:
										value = "NUMERIC value="
												+ cell.getNumericCellValue();
										break;

									case HSSFCell.CELL_TYPE_STRING:
										value = "STRING value="
												+ cell.getStringCellValue();
										break;
									case HSSFCell.CELL_TYPE_BLANK:
										value = "STRING value= NULL";
										break;

									default:
										value = "STRING value= NULL";
								}
							}
							System.out
									.println("CELL col="
											+ cell.getColumnIndex() + " VALUE="
											+ value);
						}
					}
				}
			}
			else if (args.length == 2)
			{
				if (args[1].toLowerCase().equals("write"))
				{
					System.out.println("Write mode");
					long time = System.currentTimeMillis();
					HSSFReadWrite.testCreateSampleSheet(fileName);

					System.out.println("" + (System.currentTimeMillis() - time)
							+ " ms generation time");
				}
				else
				{
					System.out.println("readwrite test");
					HSSFWorkbook wb = HSSFReadWrite.readFile(fileName);
					//指定檔案輸出對象檔案名
					FileOutputStream stream = new FileOutputStream(args[1]);
					//直接寫
					wb.write(stream);
					stream.close();
				}
			}
			else if (args.length == 3
					&& args[2].toLowerCase().equals("modify1"))
			{

				HSSFWorkbook wb = HSSFReadWrite.readFile(fileName);
				FileOutputStream stream = new FileOutputStream(args[1]);
				HSSFSheet sheet = wb.getSheetAt(0);

				for (int k = 0; k < 25; k++)
				{
					HSSFRow row = sheet.getRow(k);

					sheet.removeRow(row);
				}
				for (int k = 74; k < 100; k++)
				{
					HSSFRow row = sheet.getRow(k);

					sheet.removeRow(row);
				}
				HSSFRow row = sheet.getRow(39);
				HSSFCell cell = row.getCell(3);
				cell.setCellValue("MODIFIED CELL!!!!!");

				wb.write(stream);
				stream.close();
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
           

程式中有說明,如有問題,請大家指出