dream 发表于 2007-8-8 22:18

请问如何将matlab图像写入excel

生成的图像是jpg格式,请问如何写入excel

recbio 发表于 2007-8-9 14:23

你需要的是图像的像素点信息作为excel的单元格信息,还是图像是excel的一个对象?

matlab本身可以做到前者;

后者你只有用c作为中间工具,利用ole方式写成excel的对象。

具体你需要哪种,可以再讨论。

dream 发表于 2007-8-9 19:46

原帖由 recbio 于 2007-8-9 15:23 发表 http://www.dolc.de/forum/images/common/back.gif
你需要的是图像的像素点信息作为excel的单元格信息,还是图像是excel的一个对象?

matlab本身可以做到前者;

后者你只有用c作为中间工具,利用ole方式写成excel的对象。

具体你需要哪种,可以再讨论。


把plott的曲线作为图像写入excel里,麻烦点的话就是把图像保存成jpg 文件然后再加入 excel

recbio 发表于 2007-8-10 14:46

一个比较简单的方法就是在excel里面已经做了图,
新数据用matlab 得 xlswrite 写入excel的特定sheet,的特定单元格
这样,你的excel就有新的图了。
xlswrite就是将矩阵写成xls文件的格式。
比如:

>> d = {'T', 'V'; 1 100; 2 110; 3 115};
>> s = xlswrite('speed.xls', d, 'Speed_T', 'E1')
s =
    1

就是将变量d写到 excel 文件 speed.xls 中的 名字叫 Speed_T 的worksheet 的 E1 单元格开始的地方。

如果你要将jpg 作为图形对象写到excel里面,matlab没有现成的函数和工具,你只有用c通过ole帮忙了,这和用c直接操作excel文件没有什么两样。

dream 发表于 2007-8-10 21:25

原帖由 recbio 于 2007-8-10 15:46 发表 http://www.dolc.de/forum/images/common/back.gif
一个比较简单的方法就是在excel里面已经做了图,
新数据用matlab 得 xlswrite 写入excel的特定sheet,的特定单元格
这样,你的excel就有新的图了。
xlswrite就是将矩阵写成xls文件的格式。
比如:

>> d...

你说的方法我知道,但用excel生成的图像占空间太大,我用matlab做了个数据分析软件,原始数据是从excel读入,然后用matlab进行各种
统计运算,必用图像表示出来,之后得把图像再返回到excel.
matlab有函数可以直接将生成的图像保存到excel里去,但我不知道具体如何操作。

recbio 发表于 2007-8-12 21:11

将图形以对象的形式插入excel,这个问题不只是matlab会碰到。一般,图形的插入有两种形式,以矢量图的形式,或者,位图的形式。而后者,因为有不同的格式,可以是点阵(bmp),也可以是优化的色块和线条(jpg,gif)。
由于excel文件的专利关系,目前还不会有合法的不依赖excel的程序,可以随便修改excel的文件。从这点意义上来说,matlab 的 xlswrite 已经在打擦边球了。matlab提供的工具excel builder也是用ole excel的方式,所以,如果真的要插入图像,还不如自己用c。

如果没有excel 的类,可以自己构建一搬的excel ole方法,用windows API, CreateOleObject 参数为 “Excel.Application”
如下:
假设
Variant pApp, pWookbook, pWorkSheet;
pApp = CreateOleObject("Excel.Application"); // 新建一个excel ole 对象
或者
pApp = GetActiveOleObject("Excel.Application");// attach ole in the memory
用OlePropertyGet 可以得到一般的属性,如workbook, worksheets workseet(Item), Pictures, Picture
用OleFunction 可以得到一搬的方法, 如 Open , Insert等
比如得到一个workbook:
pWookbook = pApp .OlePropertyGet("Workbooks"). OleFunction("Open", 文件名 ,EmptyParam,EmptyParam,EmptyParam, 密码 );
比如得到一个workSheet
pWorkSheet = pWookbook.OlePropertyGet("Worksheets").OlePropertyGet("Item",1);
插入图形可以用:
pWorkSheet.OlePropertyGet("Pictures").OleFunction("Insert", 图形文件);
其实,引号里面的方法或者属性,都可以参照你计算机里面的excel VB的对象。
完事了,用方法“Close”关闭并保存
pWookbook.OleProcedure("Close", true,// SaveChange
                     EmptyParam,EmptyParam);
还有,不要忘记退出ole
pApp.OleProcedure("Quit");

以上是一般的ole插入图型的方式。虽然速度有一点慢,但是,比较保险。
限速步骤是pApp = CreateOleObject("Excel.Application"); 因为需要打开excel svr。如果你的电脑有一个活动的excel在使用,可以用
GetActiveOleObject("Excel.Application");这样就非常快速了。

第二个方法是我们自己用的,就是不依赖excel,直接对xls文件动手,但是,我们只用了类似xlswrite 的功能,也是c实现的,并没有对图像进行操作。具体的我们可以再讨论。

以下是自己一个ms的朋友拿的他们当时的excel文件的结构资料,不过网上现在也有了,所以,也不怕公开。有了这个资料,如果你要自己编写程序,插入图形对象,也不是一件难事了。

MICROSOFT EXCEL FILE FORMAT
Microsoft Excel is a popular spreadsheet. It uses a file format called BIFF (Binary
File Format). There are many types of BIFF records.Each has a 4 byte header. The
first two bytes are an opcode that specifies the record type.The second two bytes
specify record length. Header values are stored in byte-reversed form (less significant
byte first). The rest of the record is the data itself (Figure 2-1).
Figure 2-1. BIFF record header.
         | Record Header  | Record Body
Byte Number   | 0 1  2  3 |0  1  ...
       -----------------------------------
Record Contents | XX | XX | XX | XX | XX | XX | ...
       -----------------------------------
       | opcode  | length | data
  
Each X represents a hexadecimal digit
Two X's form a byte. The least significant (low) byte of the opcode is byte 0 and the
most significant (high) byte is byte 1. Similarly, the low byte of the record length
field is byte 2 and the high byte is byte 3.
BOF (Beginning of File)
The first record in every spreadsheet is always of the BOF type (Figure 2-2).
Figure 2-2. BOF record.
      | Record Header  |  Record Body  |
Byte    |0  1  2  3 | 0  1  2 3 |
      -----------------------------------------
Contents  | 09 | 00 | 04 | 00 | 02 | 00 | 10 | 00 |
      -----------------------------------------
      | opcode | length | version | file  |
      |     |     | number | type  |
The first two bytes, arranged with the low byte first, show that the opcode for BOF is
09h. The second two bytes indicate that the record body is 4 bytes long. The first two
bytes of the body are the version number (2 for the initial version of Excel). The last
two bytes are the file type. Type 10h is a worksheet file.
Relating Spreadsheet Cells to Record Data Bytes
A spreadsheet appears on a screen or printout as a matrix of rectangular cells. Each
column is identified by a letter at its top, and each row is identified by a number.
Thus cell A1 is in the first column and the first row. Cell C240 is in the third column
and the 240th row. This scheme identifies cells in a way easily understood by people.
However, it is not particularly convenient for computers, as they do not handle letters
efficiently. They are best at dealing with binary numbers. Thus, Excel stores cell
identifiers as binary numbers, that people can read as hexadecimal. The first number in
the system is 0 rather than 1.
Figure 2-3, which shows the form of an INTEGER record, illustrates the storage of column
and row information.
Figure 2-3. INTEGER record.
   | Record Header  | Record Body
Byte | 0  1 2  3 | 0 1  2  3 4  5  6 7  8 |
  ------------------------------------------------------------------
Value | 02 | 00 | 09 | 00 | 00 | 00 | 02 | 00 | 00 | 00 | 00 | 39 | 00 |
  ------------------------------------------------------------------
   | opcode | length|  row  | column |  rgbAttr  |  w |
Opcode 2 indicates an integer record. The length bytes show that the record body is 9
bytes long. Row 0 in the body corresponds to spreadsheet row 1. Row 1 corresponds to
spreadsheet row 2, and so on. Column 2 corresponds to spreadsheet column C. Thus,
Figure 2-3 deals with cell C1. The next three bytes, labeled "rgbAttr," specify cell
attributes (Table 2-3). The final pair of bytes, (labeled "w") holds the integer's
value. Here it is 39H or 57 decimal. Thus the record specifies that cell C1 of the
spreadsheet contains an integer with the value 57.
Standard File Record Order
Excel worksheet files have each record type in a predetermined position. A file need
not have all types, but the ones that are present are always be in the same order.
Table 2-1 lists the record types for Excel document (spreadsheet) files, in the order
they would appear in a BIFF file. Table 2-2 lists the types in opcode order.
Several record types in a BIFF file, namely, ROW, BLANK, INTEGER, NUMBER, LABEL,
BOOLERR, FORMULA, and COLUMN DEFAULT, describe the contents of a cell. These records
contain a 3 byte attribute field labeled "rgbAttr". The following table describes how
the bits in the field correspond to cell attributes.
Table 2-1. Cell Attributes
Byte Offset   Bit  Description           Contents
   0    7   Cell is not hidden      0b
          Cell is hidden        1b
       6   Cell is not locked      0b
          Cell is locked        1b
       5-0  Reserved, must be 0       000000b
       7-6  Font number (4 possible)
       5-0  Cell format code
   2    7   Cell is not shaded      0b
          Cell is shaded        1b
       6   Cell has no bottom border    0b
          Cell has a bottom border   1b
       5   Cell has no top border     0b
          Cell has a top border      1b
       4   Cell has no right border    0b
          Cell has a right border     1b
       3   Cell has no left border     0b
          Cell has a left border     1b
       2-0  Cell alignment code
              general         000b
              left            001b
              center           010b
              right          011b
              fill            100b
              Multiplan default align.  111b
The font number field is a zero-based index into the document's table of fonts. the
cell format code is a zero-based index into the document's table of picture formats.
There are 21 different standard formats. Additional custom formats may be defined by
the user. See the FONT and FORMAT record descriptions form additonal details.
Table 2-2. Excel Record Type in Order of Appearance
Record Type       Opcode (Hexadecimal)
BOF              09
FILEPASS          2F
INDEX             0B
CALCCOUNT           0C
CALCMODE          0D
PRECISION           0E
REFMODE            0F
DELTA             10
ITERATION           11
1904            22
BACKUP           40
PRINT ROW HEADERS       2A
PRINT GRIDLINES        2B
HORIZONTAL PAGE BREAKS   1B
VERTICAL PAGE BREAKS     1A
DEFAULT ROW HEIGHT     25
FONT            31
FONT2             32
HEADER           14
FOOTER           15
LEFT MARGIN          26
RIGHT MARGIN        27
TOP MARGIN         28
BOTTOM MARGIN         29
COLWIDTH          24
EXTERNCOUNT          16
EXTERNSHEET          17
EXTERNNAME         23
FORMATCOUNT          1F
FORMAT           1E
NAME            18
DIMENSIONS         00
COLUMN DEFAULT       20
ROW              08
BLANK             01
INTEGER            02
NUMBER           03
LABEL             04
BOOLERR            05
FORMULA            06
ARRAY             21
CONTINUE          3C
STRING           07
TABLE             36
TABLE2           37
PROTECT            12
WINDOW PROTECT       19
PASSWORD          13
NOTE            1C
WINDOW1            3D
WINDOW2            3E
PANE            41
SELECTION           1D
EOF              0A
Table 2-3. Excel Record Types in Opcode Order
Record Type       Opcode (hexadecimal)
DIMENSIONS         00
BLANK          01
INTEGER         02
NUMBER           03
LABEL          04
BOOLERR         05
FORMULA         06
STRING           07
ROW           08
BOF           09
EOF           0A
INDEX          0B
CALCCOUNT        0C
CALCMODE          0D
PRECISION        0E
REFMODE         0F
DELTA          10
ITERATION        11
PROTECT         12
PASSWORD          13
HEADER           14
FOOTER           15
EXTERNCOUNT       16
EXTERNSHEET       17
NAME            18
WINDOW PROTECT       19
VERTICAL PAGE BREAKS    1A
HORIZONTAL PAGE BREAKS   1B
NOTE            1C
SELECTION        1D
FORMAT           1E
FORMATCOUNT       1F
COLUMN DEFAULT       20
ARRAY          21
1904            22
EXTERNNAME         23
COLWIDTH          24
DEFAULT ROW HEIGHT     25
LEFT MARGIN       26
RIGHT MARGIN        27
TOP MARGIN         28
BOTTOM MARGIN      29
PRINT ROW HEADERS    2A
PRINT GRIDLINES     2B
FILEPASS          2F
FONT            31
FONT2          32
TABLE          36
TABLE2           37
CONTINUE          3C
WINDOW1         3D
WINDOW2         3E
BACKUP           40
PANE            41
----------------------------------------------------------------------------
还有一堆 record types in Opcode Order (17页word doc)
不是特别有用。如果感兴趣,可以再发。

recbio 发表于 2007-8-12 21:16

刚才看了一下,这两个值和图形有关:

Record Type: FORMAT
Description: Describes a picture format in a document.All FORMAT records must appear
together in a BIFF file.
Record Body Length: Variable
Record Body Byte Structure:
      Byte Number         Byte Description         Contents (hex)
         0                Length of format string
          1-on            Picture format string
FORMATCOUNT               1Fh                         31d

Record Type: FORMATCOUNT
Description: The number of standard FORMAT records in the file.There are 21 different
format records.
Record Body Length: 2 bytes
Record Body Byte Structure:
      Byte Number         Byte Description         Contents (hex)
          0-1               Number of built in format records.
COLUMN DEFAULT            20h                         32d

good luck!

dream 发表于 2007-8-12 21:52

谢谢楼上了,这么多我得自己消化会

lanny2185 发表于 2008-4-26 11:32

xlswrite,xlsread 这两个命令和excel文件的读取和写入有关,但是要注意读取和写入时的格式,比如有时文件中有文字和数据参杂在一块的情况,需要注意。
页: [1]
查看完整版本: 请问如何将matlab图像写入excel