通过文件结构直接生成xls文件-Java版

时间:2022-02-10 22:46:07

首先要感谢jinjazz,没有他的《通过文件结构直接生成xls文件》(http://blog.csdn.net/jinjazz/archive/2008/08/01/2753869.aspx)是不会有这份Java版代码的。

  1. import java.io.*;
  2. public class MakeExcel {
  3.     public MakeExcel() {
  4.     }
  5.     public static void main(String[] args) {
  6.         File file = null;
  7.         FileOutputStream fos = null;
  8.         try {
  9.             file = new File("test.xls");
  10.             file.createNewFile();
  11.             fos = new FileOutputStream(file);
  12.             writeBegin(fos);
  13.             writeNumber(fos, (short4, (short440.5);
  14.             writeString(fos, (short10, (short10"中文测试");
  15.             writeEnd(fos);
  16.             fos.close();
  17.         } catch (Exception e) {
  18.             e.printStackTrace();
  19.         }
  20.     }
  21.     static void writeBegin(FileOutputStream fos) {
  22.         try {
  23.             short[] header = new short[] {0x809800x1000};
  24.             for (byte i = 0; i < header.length; i++) {
  25.                 fos.write(short2bytes(header[i]));
  26.             }
  27.         } catch (Exception e) {}
  28.     }
  29.     static void writeEnd(FileOutputStream fos) {
  30.         try {
  31.             short[] end = new short[] {0xa0};
  32.             for (byte i = 0; i < end.length; i++) {
  33.                 fos.write(short2bytes(end[i]));
  34.             }
  35.         } catch (Exception e) {}
  36.     }
  37.     static void writeString(FileOutputStream fos, short x, short y,
  38.                             String s) {
  39.         try {
  40.             ByteArrayOutputStream baos = new ByteArrayOutputStream();
  41.             DataOutputStream dos = new DataOutputStream(baos);
  42.             dos.write((new String(s.getBytes("utf-8"), "utf-8")).getBytes());
  43.             dos.close();
  44.             baos.close();
  45.             byte[] b = baos.toByteArray();
  46.             short[] a = new short[] {0x204, (short) (b.length + 8), x, y, 0,
  47.                         (short) b.length};
  48.             for (byte i = 0; i < a.length; i++) {
  49.                 fos.write(short2bytes(a[i]));
  50.             }
  51.             fos.write(b);
  52.         } catch (Exception e) {}
  53.     }
  54.     static void writeNumber(FileOutputStream fos, short x, short y,
  55.                             double number) {
  56.         try {
  57.             short[] a = new short[] {0x20314, x, y, 0};
  58.             for (byte i = 0; i < a.length; i++) {
  59.                 fos.write(short2bytes(a[i]));
  60.             }
  61.             fos.write(double2bytes(number));
  62.         } catch (Exception e) {}
  63.     }
  64.     static byte[] double2bytes(double x) {
  65.         try {
  66.             ByteArrayOutputStream baos = new ByteArrayOutputStream();
  67.             DataOutputStream dos = new DataOutputStream(baos);
  68.             dos.writeDouble(x);
  69.             dos.close();
  70.             baos.close();
  71.             byte[] r = baos.toByteArray();
  72.             for (int i = 0; i < r.length / 2; i++) {
  73.                 byte tmp = r[i];
  74.                 r[i] = r[r.length - 1 - i];
  75.                 r[r.length - 1 - i] = tmp;
  76.             }
  77.             return r;
  78.         } catch (Exception e) {
  79.             return null;
  80.         }
  81.     }
  82.     static byte[] int2bytes(int x) {
  83.         byte[] b = new byte[4];
  84.         for (int i = 0; i < b.length; i++) {
  85.             b[i] = (byte) x;
  86.             x >>= 8;
  87.         }
  88.         return b;
  89.     }
  90.     static byte[] short2bytes(int x) {
  91.         byte[] b = new byte[2];
  92.         for (int i = 0; i < b.length; i++) {
  93.             b[i] = (byte) x;
  94.             x >>= 8;
  95.         }
  96.         return b;
  97.     }
  98. }