最新服务器上的版本,以后用这个
wangzhenxin
2023-11-19 bc164b8bdbfbdf1d8229a5ced6b08d7cb8db7361
commit | author | age
2207d6 1 # PHPExcel Developer Documentation
W 2
3 ## PHPExcel recipes
4
5 The following pages offer you some widely-used PHPExcel recipes. Please note that these do NOT offer complete documentation on specific PHPExcel API functions, but just a bump to get you started. If you need specific API functions, please refer to the API documentation.
6
7 For example,  REF _Ref191885321 \w \h 4.4.7  REF _Ref191885321 \h Setting a worksheet's page orientation and size covers setting a page orientation to A4. Other paper formats, like US Letter, are not covered in this document, but in the PHPExcel API documentation.
8
9 ### Setting a spreadsheet's metadata
10
11 PHPExcel allows an easy way to set a spreadsheet's metadata, using document property accessors. Spreadsheet metadata can be useful for finding a specific document in a file repository or a document management system. For example Microsoft Sharepoint uses document metadata to search for a specific document in its document lists.
12
13 Setting spreadsheet metadata is done as follows:
14
15 ```php
16 $objPHPExcel->getProperties()
17     ->setCreator("Maarten Balliauw")
18     ->setLastModifiedBy("Maarten Balliauw");
19     ->setTitle("Office 2007 XLSX Test Document")
20     ->setSubject("Office 2007 XLSX Test Document")
21     ->setDescription(
22         "Test document for Office 2007 XLSX, generated using PHP classes."
23     )
24     ->setKeywords("office 2007 openxml php")
25     ->setCategory("Test result file");
26 ```
27
28 ### Setting a spreadsheet's active sheet
29
30 The following line of code sets the active sheet index to the first sheet:
31
32 ```php
33 $objPHPExcel->setActiveSheetIndex(0);
34 ```
35
36 You can also set the active sheet by its name/title
37
38 ```php
39 $objPHPExcel->setActiveSheetIndexByName('DataSheet')
40 ```
41
42 will change the currently active sheet to the worksheet called "DataSheet".
43
44 ### Write a date or time into a cell
45
46 In Excel, dates and Times are stored as numeric values counting the number of days elapsed since 1900-01-01. For example, the date '2008-12-31' is represented as 39813. You can verify this in Microsoft Office Excel by entering that date in a cell and afterwards changing the number format to 'General' so the true numeric value is revealed. Likewise, '3:15 AM' is represented as 0.135417.
47
48 PHPExcel works with UST (Universal Standard Time) date and Time values, but does no internal conversions; so it is up to the developer to ensure that values passed to the date/time conversion functions are UST.
49
50 Writing a date value in a cell consists of 2 lines of code. Select the method that suits you the best. Here are some examples:
51
52 ```php
53 /* PHPExcel_Cell_AdvanceValueBinder required for this sample */
54 require_once 'PHPExcel/Cell/AdvancedValueBinder.php';
55
56 // MySQL-like timestamp '2008-12-31' or date string
57 PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );
58
59 $objPHPExcel->getActiveSheet()
60     ->setCellValue('D1', '2008-12-31');
61
62 $objPHPExcel->getActiveSheet()->getStyle('D1')
63     ->getNumberFormat()
64     ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
65
66 // PHP-time (Unix time)
67 $time = gmmktime(0,0,0,12,31,2008); // int(1230681600)
68 $objPHPExcel->getActiveSheet()
69     ->setCellValue('D1', PHPExcel_Shared_Date::PHPToExcel($time));
70 $objPHPExcel->getActiveSheet()->getStyle('D1')
71     ->getNumberFormat()
72     ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
73
74 // Excel-date/time
75 $objPHPExcel->getActiveSheet()->setCellValue('D1', 39813)
76 $objPHPExcel->getActiveSheet()->getStyle('D1')
77     ->getNumberFormat()
78     ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
79 ```
80
81 The above methods for entering a date all yield the same result. PHPExcel_Style_NumberFormat provides a lot of pre-defined date formats.
82
83 The PHPExcel_Shared_Date::PHPToExcel() method will also work with a PHP DateTime object.
84
85 Similarly, times (or date and time values) can be entered in the same fashion: just remember to use an appropriate format code.
86
87 __Notes:__
88
89 See section "Using value binders to facilitate data entry" to learn more about the AdvancedValueBinder used in the first example.
90 In previous versions of PHPExcel up to and including 1.6.6, when a cell had a date-like number format code, it was possible to enter a date directly using an integer PHP-time without converting to Excel date format. Starting with PHPExcel 1.6.7 this is no longer supported.
91 Excel can also operate in a 1904-based calendar (default for workbooks saved on Mac). Normally, you do not have to worry about this when using PHPExcel.
92
93 ### Write a formula into a cell
94
95 Inside the Excel file, formulas are always stored as they would appear in an English version of Microsoft Office Excel, and PHPExcel handles all formulae internally in this format. This means that the following rules hold:
96
97  - Decimal separator is '.' (period)
98  - Function argument separator is ',' (comma)
99  - Matrix row separator is ';' (semicolon)
100  - English function names must be used
101
102 This is regardless of which language version of Microsoft Office Excel may have been used to create the Excel file.
103
104 When the final workbook is opened by the user, Microsoft Office Excel will take care of displaying the formula according the applications language. Translation is taken care of by the application!
105
106 The following line of code writes the formula '=IF(C4>500,"profit","loss")' into the cell B8. Note that the formula must start with "=" to make PHPExcel recognise this as a formula.
107
108 ```php
109 $objPHPExcel->getActiveSheet()->setCellValue('B8','=IF(C4>500,"profit","loss")');
110 ```
111
112 If you want to write a string beginning with an "=" character to a cell, then you should use the setCellValueExplicit() method.
113
114 ```php
115 $objPHPExcel->getActiveSheet()
116     ->setCellValueExplicit(
117         'B8',
118         '=IF(C4>500,"profit","loss")',
119         PHPExcel_Cell_DataType::TYPE_STRING
120     );
121 ```
122
123 A cell's formula can be read again using the following line of code:
124
125 ```php
126 $formula = $objPHPExcel->getActiveSheet()->getCell('B8')->getValue();
127 ```
128
129 If you need the calculated value of a cell, use the following code. This is further explained in  REF _Ref191885372 \w \h  \* MERGEFORMAT 4.4.35.
130
131 ```php
132 $value = $objPHPExcel->getActiveSheet()->getCell('B8')->getCalculatedValue();
133 ```
134
135 ### Locale Settings for Formulae
136
137 Some localisation elements have been included in PHPExcel. You can set a locale by changing the settings. To set the locale to Russian you would use:
138
139 ```php
140 $locale = 'ru';
141 $validLocale = PHPExcel_Settings::setLocale($locale);
142 if (!$validLocale) {
143     echo 'Unable to set locale to '.$locale." - reverting to en_us<br />\n";
144 }
145 ```
146
147 If Russian language files aren't available, the `setLocale()` method will return an error, and English settings will be used throughout.
148
149 Once you have set a locale, you can translate a formula from its internal English coding.
150
151 ```php
152 $formula = $objPHPExcel->getActiveSheet()->getCell('B8')->getValue();
153 $translatedFormula = PHPExcel_Calculation::getInstance()->_translateFormulaToLocale($formula);
154 ```
155
156 You can also create a formula using the function names and argument separators appropriate to the defined locale; then translate it to English before setting the cell value:
157
158 ```php
159 $formula = '=????360(????(2010;2;5);????(2010;12;31);??????)';
160 $internalFormula = PHPExcel_Calculation::getInstance()->translateFormulaToEnglish($formula);
161 $objPHPExcel->getActiveSheet()->setCellValue('B8',$internalFormula);
162 ```
163
164 Currently, formula translation only translates the function names, the constants TRUE and FALSE, and the function argument separators.
165
166 At present, the following locale settings are supported:
167
168     Language             |                      | Locale Code
169     ---------------------|----------------------|-------------
170     Czech                | Ceština              | cs
171     Danish               | Dansk                | da
172     German               | Deutsch              | de
173     Spanish              | Español              | es
174     Finnish              | Suomi                | fi
175     French               | Français             | fr
176     Hungarian            | Magyar               | hu
177     Italian              | Italiano             | it
178     Dutch                | Nederlands           | nl
179     Norwegian            | Norsk                | no
180     Polish               | Jezyk polski         | pl
181     Portuguese           | Português            | pt
182     Brazilian Portuguese | Português Brasileiro | pt_br
183     Russian              | ??????? ????         | ru
184     Swedish              | Svenska              | sv
185     Turkish              | Türkçe               | tr
186
187 ### Write a newline character "\n" in a cell (ALT+"Enter")
188
189 In Microsoft Office Excel you get a line break in a cell by hitting ALT+"Enter". When you do that, it automatically turns on "wrap text" for the cell.
190
191 Here is how to achieve this in PHPExcel:
192
193 ```php
194 $objPHPExcel->getActiveSheet()->getCell('A1')->setValue("hello\nworld");
195 $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setWrapText(true);
196 ```
197
198 __Tip__
199
200 Read more about formatting cells using getStyle() elsewhere.
201
202 __Tip__
203
204 AdvancedValuebinder.php automatically turns on "wrap text" for the cell when it sees a newline character in a string that you are inserting in a cell. Just like Microsoft Office Excel. Try this:
205
206 ```php
207 require_once 'PHPExcel/Cell/AdvancedValueBinder.php';
208 PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );
209
210 $objPHPExcel->getActiveSheet()->getCell('A1')->setValue("hello\nworld");
211 ```
212
213 Read more about AdvancedValueBinder.php elsewhere.
214
215 ### Explicitly set a cell's datatype
216
217 You can set a cell's datatype explicitly by using the cell's setValueExplicit method, or the setCellValueExplicit method of a worksheet. Here's an example:
218
219 ```php
220 $objPHPExcel->getActiveSheet()->getCell('A1')
221     ->setValueExplicit(
222         '25', 
223         PHPExcel_Cell_DataType::TYPE_NUMERIC
224     );
225 ```
226
227 ### Change a cell into a clickable URL
228
229 You can make a cell a clickable URL by setting its hyperlink property:
230
231 ```php
232 $objPHPExcel->getActiveSheet()->setCellValue('E26', 'www.phpexcel.net');
233 $objPHPExcel->getActiveSheet()->getCell('E26')->getHyperlink()->setUrl('http://www.phpexcel.net');
234 ```
235
236 If you want to make a hyperlink to another worksheet/cell, use the following code:
237
238 ```php
239 $objPHPExcel->getActiveSheet()->setCellValue('E26', 'www.phpexcel.net');
240 $objPHPExcel->getActiveSheet()->getCell('E26')->getHyperlink()->setUrl("sheet://'Sheetname'!A1");
241 ```
242
243 ### Setting Printer Options for Excel files
244
245 #### Setting a worksheet's page orientation and size
246
247 Setting a worksheet's page orientation and size can be done using the following lines of code:
248
249 ```php
250 $objPHPExcel->getActiveSheet()->getPageSetup()
251     ->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);
252 $objPHPExcel->getActiveSheet()->getPageSetup()
253     ->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
254 ```
255
256 Note that there are additional page settings available. Please refer to the API documentation for all possible options.
257
258 #### Page Setup: Scaling options
259
260 The page setup scaling options in PHPExcel relate directly to the scaling options in the "Page Setup" dialog as shown in the illustration.
261
262 Default values in PHPExcel correspond to default values in MS Office Excel as shown in illustration
263
264 ![08-page-setup-scaling-options.png](./images/08-page-setup-scaling-options.png "")
265
266     method              | initial value | calling method will trigger | Note
267     --------------------|:-------------:|-----------------------------|------
268     setFitToPage(...)   | FALSE         | -                           | 
269     setScale(...)       | 100           | setFitToPage(FALSE)         |
270     setFitToWidth(...)  | 1             | setFitToPage(TRUE)          | value 0 means do-not-fit-to-width
271     setFitToHeight(...) | 1             | setFitToPage(TRUE)          | value 0 means do-not-fit-to-height
272
273 ##### Example
274
275 Here is how to fit to 1 page wide by infinite pages tall:
276
277 ```php
278 $objPHPExcel->getActiveSheet()->getPageSetup()->setFitToWidth(1);
279 $objPHPExcel->getActiveSheet()->getPageSetup()->setFitToHeight(0);
280 ```
281
282 As you can see, it is not necessary to call setFitToPage(TRUE) since setFitToWidth(...) and setFitToHeight(...) triggers this.
283
284 If you use setFitToWidth() you should in general also specify setFitToHeight() explicitly like in the example. Be careful relying on the initial values. This is especially true if you are upgrading from PHPExcel 1.7.0 to 1.7.1 where the default values for fit-to-height and fit-to-width changed from 0 to 1.
285
286 #### Page margins
287
288 To set page margins for a worksheet, use this code:
289
290 ```php
291 $objPHPExcel->getActiveSheet()->getPageMargins()->setTop(1);
292 $objPHPExcel->getActiveSheet()->getPageMargins()->setRight(0.75);
293 $objPHPExcel->getActiveSheet()->getPageMargins()->setLeft(0.75);
294 $objPHPExcel->getActiveSheet()->getPageMargins()->setBottom(1);
295 ```
296
297 Note that the margin values are specified in inches.
298
299 ![08-page-setup-margins.png](./images/08-page-setup-margins.png "")
300
301 #### Center a page horizontally/vertically
302
303 To center a page horizontally/vertically, you can use the following code:
304
305 ```php
306 $objPHPExcel->getActiveSheet()->getPageSetup()->setHorizontalCentered(true);
307 $objPHPExcel->getActiveSheet()->getPageSetup()->setVerticalCentered(false);
308 ```
309
310 #### Setting the print header and footer of a worksheet
311
312 Setting a worksheet's print header and footer can be done using the following lines of code:
313
314 ```php
315 $objPHPExcel->getActiveSheet()->getHeaderFooter()
316     ->setOddHeader('&C&HPlease treat this document as confidential!');
317 $objPHPExcel->getActiveSheet()->getHeaderFooter()
318     ->setOddFooter('&L&B' . $objPHPExcel->getProperties()->getTitle() . '&RPage &P of &N');
319 ```
320
321 Substitution and formatting codes (starting with &) can be used inside headers and footers. There is no required order in which these codes must appear.
322
323 The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again:
324
325  - Strikethrough
326  - Superscript
327  - Subscript
328
329 Superscript and subscript cannot both be ON at same time. Whichever comes first wins and the other is ignored, while the first is ON.
330
331 The following codes are supported by Excel2007:
332
333 Code                   | Meaning
334 -----------------------|-----------
335 &L                     | Code for "left section" (there are three header / footer locations, "left", "center", and "right"). When two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the order of appearance, and placed into the left section.
336 &P                     | Code for "current page #"
337 &N                     | Code for "total pages"
338 &font size             | Code for "text font size", where font size is a font size in points.
339 &K                     | Code for "text font color" - RGB Color is specified as RRGGBB Theme Color is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade value, NN is the tint/shade value.
340 &S                     | Code for "text strikethrough" on / off
341 &X                     | Code for "text super script" on / off
342 &Y                     | Code for "text subscript" on / off
343 &C                     | Code for "center section". When two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the order of appearance, and placed into the center section.
344 &D                     | Code for "date"
345 &T                     | Code for "time"
346 &G                     | Code for "picture as background" - Please make sure to add the image to the header/footer[^print-footer-image-footnote]
347 &U                     | Code for "text single underline"
348 &E                     | Code for "double underline"
349 &R                     | Code for "right section". When two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the order of appearance, and placed into the right section.
350 &Z                     | Code for "this workbook's file path"
351 &F                     | Code for "this workbook's file name"
352 &A                     | Code for "sheet tab name"
353 &+                     | Code for add to page #
354 &-                     | Code for subtract from page #
355 &"font name,font type" | Code for "text font name" and "text font type", where font name and font type are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font name, it means "none specified". Both of font name and font type can be localized values.
356 &"-,Bold"              | Code for "bold font style"
357 &B                     | Code for "bold font style"
358 &"-,Regular"           | Code for "regular font style"
359 &"-,Italic"            | Code for "italic font style"
360 &I                     | Code for "italic font style"
361 &"-,Bold Italic"       | Code for "bold italic font style"
362 &O                     | Code for "outline style"
363 &H                     | Code for "shadow style"
364
365  [^print-footer-image-footnote]: z
366 ```php
367 $objDrawing = new PHPExcel_Worksheet_HeaderFooterDrawing();
368 $objDrawing->setName('PHPExcel logo');
369 $objDrawing->setPath('./images/phpexcel_logo.gif');
370 $objDrawing->setHeight(36);
371 $objPHPExcel->getActiveSheet()->getHeaderFooter()->addImage($objDrawing, PHPExcel_Worksheet_HeaderFooter::IMAGE_HEADER_LEFT);
372 ```
373
374 __Tip__
375
376 The above table of codes may seem overwhelming first time you are trying to figure out how to write some header or footer. Luckily, there is an easier way. Let Microsoft Office Excel do the work for you.For example, create in Microsoft Office Excel an xlsx file where you insert the header and footer as desired using the programs own interface. Save file as test.xlsx. Now, take that file and read off the values using PHPExcel as follows:
377
378 ```php
379 $objPHPexcel = PHPExcel_IOFactory::load('test.xlsx');
380 $objWorksheet = $objPHPexcel->getActiveSheet();
381
382 var_dump($objWorksheet->getHeaderFooter()->getOddFooter());
383 var_dump($objWorksheet->getHeaderFooter()->getEvenFooter());
384 var_dump($objWorksheet->getHeaderFooter()->getOddHeader());
385 var_dump($objWorksheet->getHeaderFooter()->getEvenHeader());
386 ```
387
388 That reveals the codes for the even/odd header and footer. Experienced users may find it easier to rename test.xlsx to test.zip, unzip it, and inspect directly the contents of the relevant xl/worksheets/sheetX.xml to find the codes for header/footer.
389
390 #### Setting printing breaks on a row or column
391
392 To set a print break, use the following code, which sets a row break on row 10.
393
394 ```php
395 $objPHPExcel->getActiveSheet()->setBreak( 'A10' , PHPExcel_Worksheet::BREAK_ROW );
396 ```
397
398 The following line of code sets a print break on column D:
399
400 ```php
401 $objPHPExcel->getActiveSheet()->setBreak( 'D10' , PHPExcel_Worksheet::BREAK_COLUMN );
402 ```
403
404 #### Show/hide gridlines when printing
405
406 To show/hide gridlines when printing, use the following code:
407
408 $objPHPExcel->getActiveSheet()->setShowGridlines(true);
409
410 #### Setting rows/columns to repeat at top/left
411
412 PHPExcel can repeat specific rows/cells at top/left of a page. The following code is an example of how to repeat row 1 to 5 on each printed page of a specific worksheet:
413
414 ```php
415 $objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 5);
416 ```
417
418 #### Specify printing area
419
420 To specify a worksheet's printing area, use the following code:
421
422 ```php
423 $objPHPExcel->getActiveSheet()->getPageSetup()->setPrintArea('A1:E5');
424 ```
425
426 There can also be multiple printing areas in a single worksheet:
427
428 ```php
429 $objPHPExcel->getActiveSheet()->getPageSetup()->setPrintArea('A1:E5,G4:M20');
430 ```
431
432 ### Styles
433
434 #### Formatting cells
435
436 A cell can be formatted with font, border, fill, ... style information. For example, one can set the  foreground colour of a cell to red, aligned to the right, and the border to black and thick border style. Let's do that on cell B2:
437
438 ```php
439 $objPHPExcel->getActiveSheet()->getStyle('B2')
440     ->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
441 $objPHPExcel->getActiveSheet()->getStyle('B2')
442     ->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
443 $objPHPExcel->getActiveSheet()->getStyle('B2')
444     ->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
445 $objPHPExcel->getActiveSheet()->getStyle('B2')
446     ->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
447 $objPHPExcel->getActiveSheet()->getStyle('B2')
448     ->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
449 $objPHPExcel->getActiveSheet()->getStyle('B2')
450     ->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
451 $objPHPExcel->getActiveSheet()->getStyle('B2')
452     ->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
453 $objPHPExcel->getActiveSheet()->getStyle('B2')
454     ->getFill()->getStartColor()->setARGB('FFFF0000');
455 ```
456
457 Starting with PHPExcel 1.7.0 getStyle() also accepts a cell range as a parameter. For example, you can set a red background color on a range of cells:
458
459 ```php
460 $objPHPExcel->getActiveSheet()->getStyle('B3:B7')->getFill()
461     ->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
462     ->getStartColor()->setARGB('FFFF0000');
463 ```
464
465 __Tip__
466 It is recommended to style many cells at once, using e.g. getStyle('A1:M500'), rather than styling the cells individually in a loop. This is much faster compared to looping through cells and styling them individually.
467
468 There is also an alternative manner to set styles. The following code sets a cell's style to font bold, alignment right, top border thin and a gradient fill:
469
470 ```php
471 $styleArray = array(
472     'font' => array(
473         'bold' => true,
474     ),
475     'alignment' => array(
476         'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_RIGHT,
477     ),
478     'borders' => array(
479         'top' => array(
480             'style' => PHPExcel_Style_Border::BORDER_THIN,
481         ),
482     ),
483     'fill' => array(
484         'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR,
485         'rotation' => 90,
486         'startcolor' => array(
487             'argb' => 'FFA0A0A0',
488         ),
489         'endcolor' => array(
490             'argb' => 'FFFFFFFF',
491         ),
492     ),
493 );
494
495 $objPHPExcel->getActiveSheet()->getStyle('A3')->applyFromArray($styleArray);
496 ```
497
498 Or with a range of cells:
499
500 ```php
501 $objPHPExcel->getActiveSheet()->getStyle('B3:B7')->applyFromArray($styleArray);
502 ```
503
504 This alternative method using arrays should be faster in terms of execution whenever you are setting more than one style property. But the difference may barely be measurable unless you have many different styles in your workbook.
505
506 Prior to PHPExcel 1.7.0 duplicateStyleArray() was the recommended method for styling a cell range, but this method has now been deprecated since getStyle() has started to accept a cell range.
507
508 #### Number formats
509
510 You often want to format numbers in Excel. For example you may want a thousands separator plus a fixed number of decimals after the decimal separator. Or perhaps you want some numbers to be zero-padded.
511
512 In Microsoft Office Excel you may be familiar with selecting a number format from the "Format Cells" dialog. Here there are some predefined number formats available including some for dates. The dialog is designed in a way so you don't have to interact with the underlying raw number format code unless you need a custom number format.
513
514 In PHPExcel, you can also apply various predefined number formats. Example:
515
516 ```php
517 $objPHPExcel->getActiveSheet()->getStyle('A1')->getNumberFormat()
518     ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
519 ```
520
521 This will format a number e.g. 1587.2 so it shows up as 1,587.20 when you open the workbook in MS Office Excel. (Depending on settings for decimal and thousands separators in Microsoft Office Excel it may show up as 1.587,20)
522
523 You can achieve exactly the same as the above by using this:
524
525 ```php
526 $objPHPExcel->getActiveSheet()->getStyle('A1')->getNumberFormat()
527     ->setFormatCode('#,##0.00');
528 ```
529
530 In Microsoft Office Excel, as well as in PHPExcel, you will have to interact with raw number format codes whenever you need some special custom number format. Example:
531
532 ```php
533 $objPHPExcel->getActiveSheet()->getStyle('A1')->getNumberFormat()
534     ->setFormatCode('[Blue][>=3000]$#,##0;[Red][<0]$#,##0;$#,##0');
535 ```
536
537 Another example is when you want numbers zero-padded with leading zeros to a fixed length:
538
539 ```php
540 $objPHPExcel->getActiveSheet()->getCell('A1')->setValue(19);
541 $objPHPExcel->getActiveSheet()->getStyle('A1')->getNumberFormat()
542     ->setFormatCode('0000'); // will show as 0019 in Excel
543 ```
544
545 __Tip__
546 The rules for composing a number format code in Excel can be rather complicated. Sometimes you know how to create some number format in Microsoft Office Excel, but don't know what the underlying number format code looks like. How do you find it?
547
548 The readers shipped with PHPExcel come to the rescue. Load your template workbook using e.g. Excel2007 reader to reveal the number format code. Example how read a number format code for cell A1:
549
550 ```php
551 $objReader = PHPExcel_IOFactory::createReader('Excel2007');
552 $objPHPExcel = $objReader->load('template.xlsx');
553 var_dump($objPHPExcel->getActiveSheet()->getStyle('A1')->getNumberFormat()->getFormatCode());
554 ```
555
556 Advanced users may find it faster to inspect the number format code directly by renaming template.xlsx to template.zip, unzipping, and looking for the relevant piece of XML code holding the number format code in *xl/styles.xml*.
557
558 #### Alignment and wrap text
559
560 Let's set vertical alignment to the top for cells A1:D4
561
562 ```php
563 $objPHPExcel->getActiveSheet()->getStyle('A1:D4')
564     ->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_TOP);
565 ```
566
567 Here is how to achieve wrap text:
568
569 ```php
570 $objPHPExcel->getActiveSheet()->getStyle('A1:D4')
571     ->getAlignment()->setWrapText(true);
572 ```
573
574 #### Setting the default style of a workbook
575
576 It is possible to set the default style of a workbook. Let's set the default font to Arial size 8:
577
578 ```php
579 $objPHPExcel->getDefaultStyle()->getFont()->setName('Arial');
580 $objPHPExcel->getDefaultStyle()->getFont()->setSize(8);
581 ```
582
583 #### Styling cell borders
584
585 In PHPExcel it is easy to apply various borders on a rectangular selection. Here is how to apply a thick red border outline around cells B2:G8.
586
587 ```php
588 $styleArray = array(
589     'borders' => array(
590         'outline' => array(
591             'style' => PHPExcel_Style_Border::BORDER_THICK,
592             'color' => array('argb' => 'FFFF0000'),
593         ),
594     ),
595 );
596
597 $objWorksheet->getStyle('B2:G8')->applyFromArray($styleArray);
598 ```
599
600 In Microsoft Office Excel, the above operation would correspond to selecting the cells B2:G8, launching the style dialog, choosing a thick red border, and clicking on the "Outline" border component.
601
602 Note that the border outline is applied to the rectangular selection B2:G8 as a whole, not on each cell individually.
603
604 You can achieve any border effect by using just the 5 basic borders and operating on a single cell at a time:
605
606     Array key | Maps to property
607     ----------|------------------
608     left      | getLeft()
609     right     | getRight()
610     top       | getTop()
611     bottom    | getBottom()
612     diagonal  | getDiagonal()
613
614 Additional shortcut borders come in handy like in the example above. These are the shortcut borders available:
615
616     Array key  | Maps to property
617     -----------|------------------
618     allborders | getAllBorders()
619     outline    | getOutline()
620     inside     | getInside()
621     vertical   | getVertical()
622     horizontal | getHorizontal()
623
624
625
626 An overview of all border shortcuts can be seen in the following image:
627
628 ![08-styling-border-options.png](./images/08-styling-border-options.png "")
629
630 If you simultaneously set e.g. allborders and vertical, then we have "overlapping" borders, and one of the components has to win over the other where there is border overlap. In PHPExcel, from weakest to strongest borders, the list is as follows: allborders, outline/inside, vertical/horizontal, left/right/top/bottom/diagonal.
631
632 This border hierarchy can be utilized to achieve various effects in an easy manner.
633
634 ### Conditional formatting a cell
635
636 A cell can be formatted conditionally, based on a specific rule. For example, one can set the foreground colour of a cell to red if its value is below zero, and to green if its value is zero or more.
637
638 One can set a conditional style ruleset to a cell using the following code:
639
640 ```php
641 $objConditional1 = new PHPExcel_Style_Conditional();
642 $objConditional1->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS);
643 $objConditional1->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_LESSTHAN);
644 $objConditional1->addCondition('0');
645 $objConditional1->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
646 $objConditional1->getStyle()->getFont()->setBold(true);
647
648 $objConditional2 = new PHPExcel_Style_Conditional();
649 $objConditional2->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS);
650 $objConditional2->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_GREATERTHANOREQUAL);
651 $objConditional2->addCondition('0');
652 $objConditional2->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_GREEN);
653 $objConditional2->getStyle()->getFont()->setBold(true);
654
655 $conditionalStyles = $objPHPExcel->getActiveSheet()->getStyle('B2')->getConditionalStyles();
656 array_push($conditionalStyles, $objConditional1);
657 array_push($conditionalStyles, $objConditional2);
658
659 $objPHPExcel->getActiveSheet()->getStyle('B2')->setConditionalStyles($conditionalStyles);
660 ```
661
662 If you want to copy the ruleset to other cells, you can duplicate the style object:
663
664 ```php
665 $objPHPExcel->getActiveSheet()
666     ->duplicateStyle(
667         $objPHPExcel->getActiveSheet()->getStyle('B2'), 
668         'B3:B7' 
669     );
670 ```
671
672 ### Add a comment to a cell
673
674 To add a comment to a cell, use the following code. The example below adds a comment to cell E11:
675
676 ```php
677 $objPHPExcel->getActiveSheet()
678     ->getComment('E11')
679     ->setAuthor('Mark Baker');
680 $objCommentRichText = $objPHPExcel->getActiveSheet()
681     ->getComment('E11')
682     ->getText()->createTextRun('PHPExcel:');
683 $objCommentRichText->getFont()->setBold(true);
684 $objPHPExcel->getActiveSheet()
685     ->getComment('E11')
686     ->getText()->createTextRun("\r\n");
687 $objPHPExcel->getActiveSheet()
688     ->getComment('E11')
689     ->getText()->createTextRun('Total amount on the current invoice, excluding VAT.');
690 ```
691
692 ![08-cell-comment.png](./images/08-cell-comment.png "")
693
694 ### Apply autofilter to a range of cells
695
696 To apply an autofilter to a range of cells, use the following code:
697
698 ```php
699 $objPHPExcel->getActiveSheet()->setAutoFilter('A1:C9');
700 ```
701
702 __Make sure that you always include the complete filter range!__
703 Excel does support setting only the captionrow, but that's __not__ a best practice...
704
705 ### Setting security on a spreadsheet
706
707 Excel offers 3 levels of "protection": document security, sheet security and cell security.
708
709 Document security allows you to set a password on a complete spreadsheet, allowing changes to be made only when that password is entered.Worksheet security offers other security options: you can disallow inserting rows on a specific sheet, disallow sorting, ... Cell security offers the option to lock/unlock a cell as well as show/hide the internal formulaAn example on setting document security:
710
711 ```php
712 $objPHPExcel->getSecurity()->setLockWindows(true);
713 $objPHPExcel->getSecurity()->setLockStructure(true);
714 $objPHPExcel->getSecurity()->setWorkbookPassword("PHPExcel");
715 ```
716
717 An example on setting worksheet security:
718
719 ```php
720 $objPHPExcel->getActiveSheet()
721     ->getProtection()->setPassword('PHPExcel');
722 $objPHPExcel->getActiveSheet()
723     ->getProtection()->setSheet(true);
724 $objPHPExcel->getActiveSheet()
725     ->getProtection()->setSort(true);
726 $objPHPExcel->getActiveSheet()
727     ->getProtection()->setInsertRows(true);
728 $objPHPExcel->getActiveSheet()
729     ->getProtection()->setFormatCells(true);
730 ```
731
732 An example on setting cell security:
733
734 ```php
735 $objPHPExcel->getActiveSheet()->getStyle('B1')
736     ->getProtection()
737     ->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);
738 ```
739
740 __Make sure you enable worksheet protection if you need any of the worksheet protection features!__ This can be done using the following code:
741
742 ```php
743 $objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
744 ```
745
746 ### Setting data validation on a cell
747
748 Data validation is a powerful feature of Excel2007. It allows to specify an input filter on the data that can be inserted in a specific cell. This filter can be a range (i.e. value must be between 0 and 10), a list (i.e. value must be picked from a list), ...
749
750 The following piece of code only allows numbers between 10 and 20 to be entered in cell B3:
751
752 ```php
753 $objValidation = $objPHPExcel->getActiveSheet()->getCell('B3')
754     ->getDataValidation();
755 $objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_WHOLE );
756 $objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_STOP );
757 $objValidation->setAllowBlank(true);
758 $objValidation->setShowInputMessage(true);
759 $objValidation->setShowErrorMessage(true);
760 $objValidation->setErrorTitle('Input error');
761 $objValidation->setError('Number is not allowed!');
762 $objValidation->setPromptTitle('Allowed input');
763 $objValidation->setPrompt('Only numbers between 10 and 20 are allowed.');
764 $objValidation->setFormula1(10);
765 $objValidation->setFormula2(20);
766 ```
767
768 This validation will limit the length of text that can be entered in a cell to 6 characters.
769
770 ```
771 $objValidation = $objPHPExcel->getActiveSheet()->getCell('B9')->getDataValidation();
772 $objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_TEXTLENGTH );
773 $objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_STOP );
774 $objValidation->setAllowBlank(true);
775 $objValidation->setShowInputMessage(true);
776 $objValidation->setShowErrorMessage(true);
777 $objValidation->setErrorTitle('Input error');
778 $objValidation->setError('Text exceeds maximum length');
779 $objValidation->setPromptTitle('Allowed input');
780 $objValidation->setPrompt('Maximum text length is 6 characters.');
781 $objValidation->setFormula1(6);
782 ```
783
784 The following piece of code only allows an item picked from a list of data to be entered in cell B3:
785
786 ```php
787 $objValidation = $objPHPExcel->getActiveSheet()->getCell('B5')
788     ->getDataValidation();
789 $objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST );
790 $objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION );
791 $objValidation->setAllowBlank(false);
792 $objValidation->setShowInputMessage(true);
793 $objValidation->setShowErrorMessage(true);
794 $objValidation->setShowDropDown(true);
795 $objValidation->setErrorTitle('Input error');
796 $objValidation->setError('Value is not in list.');
797 $objValidation->setPromptTitle('Pick from list');
798 $objValidation->setPrompt('Please pick a value from the drop-down list.');
799 $objValidation->setFormula1('"Item A,Item B,Item C"');
800 ```
801
802 When using a data validation list like above, make sure you put the list between " and " and that you split the items with a comma (,).
803
804 It is important to remember that any string participating in an Excel formula is allowed to be maximum 255 characters (not bytes). This sets a limit on how many items you can have in the string "Item A,Item B,Item C". Therefore it is normally a better idea to type the item values directly in some cell range, say A1:A3, and instead use, say, $objValidation->setFormula1('Sheet!$A$1:$A$3');. Another benefit is that the item values themselves can contain the comma "," character itself.
805
806 If you need data validation on multiple cells, one can clone the ruleset:
807
808 ```php
809 $objPHPExcel->getActiveSheet()->getCell('B8')->setDataValidation(clone $objValidation);
810 ```
811
812 ### Setting a column's width
813
814 A column's width can be set using the following code:
815
816 ```php
817 $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);
818 ```
819
820 If you want PHPExcel to perform an automatic width calculation, use the following code. PHPExcel will approximate the column with to the width of the widest column value.
821
822 ```php
823 $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
824 ```
825
826 ![08-column-width.png](./images/08-column-width.png "")
827
828 The measure for column width in PHPExcel does __not__ correspond exactly to the measure you may be used to in Microsoft Office Excel. Column widths are difficult to deal with in Excel, and there are several measures for the column width.1) __Inner width in character units__ (e.g. 8.43 this is probably what you are familiar with in Excel)2) __Full width in pixels__ (e.g. 64 pixels)3) __Full width in character units__ (e.g. 9.140625, value -1 indicates unset width)__PHPExcel always operates with 3) "Full width in character units"__ which is in fact the only value that is stored in any Excel file, hence the most reliable measure. Unfortunately, __Microsoft ____Office ____Excel does not present you with this ____measure__. Instead measures 1) and 2) are computed by the application when the file is opened and these values are presented in various dialogues and tool tips.The character width unit is the width of a '0' (zero) glyph in the workbooks default font. Therefore column widths measured in character units in two different workbooks can only be compared if they have the same default workbook font.If you have some Excel file and need to know the column widths in measure 3), you can read the Excel file with PHPExcel and echo the retrieved values.
829
830 ### Show/hide a column
831
832 To set a worksheet's column visibility, you can use the following code. The first line explicitly shows the column C, the second line hides column D.
833
834 ```php
835 $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(true);
836 $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false);
837 ```
838
839 ### Group/outline a column
840
841 To group/outline a column, you can use the following code:
842
843 ```php
844 $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1);
845 ```
846
847 You can also collapse the column. Note that you should also set the column invisible, otherwise the collapse will not be visible in Excel 2007.
848
849 ```php
850 $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setCollapsed(true);
851 $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setVisible(false);
852 ```
853
854 Please refer to the section "group/outline a row" for a complete example on collapsing.
855
856 You can instruct PHPExcel to add a summary to the right (default), or to the left. The following code adds the summary to the left:
857
858 ```php
859 $objPHPExcel->getActiveSheet()->setShowSummaryRight(false);
860 ```
861
862 ### Setting a row's height
863
864 A row's height can be set using the following code:
865
866 ```php
867 $objPHPExcel->getActiveSheet()->getRowDimension('10')->setRowHeight(100);
868 ```
869
870 Excel measures row height in points, where 1 pt is 1/72 of an inch (or about 0.35mm). The default value is 12.75 pts; and the permitted range of values is between 0 and 409 pts, where 0 pts is a hidden row.
871
872 ### Show/hide a row
873
874 To set a worksheet''s row visibility, you can use the following code. The following example hides row number 10.
875
876 ```php
877 $objPHPExcel->getActiveSheet()->getRowDimension('10')->setVisible(false);
878 ```
879
880 Note that if you apply active filters using an AutoFilter, then this will override any rows that you hide or unhide manually within that AutoFilter range if you save the file.
881
882 ### Group/outline a row
883
884 To group/outline a row, you can use the following code:
885
886 ```php
887 $objPHPExcel->getActiveSheet()->getRowDimension('5')->setOutlineLevel(1);
888 ```
889
890 You can also collapse the row. Note that you should also set the row invisible, otherwise the collapse will not be visible in Excel 2007.
891
892 ```php
893 $objPHPExcel->getActiveSheet()->getRowDimension('5')->setCollapsed(true);
894 $objPHPExcel->getActiveSheet()->getRowDimension('5')->setVisible(false);
895 ```
896
897 Here's an example which collapses rows 50 to 80:
898
899 ```php
900 for ($i = 51; $i <= 80; $i++) {
901     $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i");
902     $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, "LName $i");
903     $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, "PhoneNo $i");
904     $objPHPExcel->getActiveSheet()->setCellValue('D' . $i, "FaxNo $i");
905     $objPHPExcel->getActiveSheet()->setCellValue('E' . $i, true);
906     $objPHPExcel->getActiveSheet()->getRowDimension($i)->setOutlineLevel(1);
907     $objPHPExcel->getActiveSheet()->getRowDimension($i)->setVisible(false);
908 }
909
910 $objPHPExcel->getActiveSheet()->getRowDimension(81)->setCollapsed(true);
911 ```
912
913 You can instruct PHPExcel to add a summary below the collapsible rows (default), or above. The following code adds the summary above:
914
915 ```php
916 $objPHPExcel->getActiveSheet()->setShowSummaryBelow(false);
917 ```
918
919 ### Merge/unmerge cells
920
921 If you have a big piece of data you want to display in a worksheet, you can merge two or more cells together, to become one cell. This can be done using the following code:
922
923 ```php
924 $objPHPExcel->getActiveSheet()->mergeCells('A18:E22');
925 ```
926
927 Removing a merge can be done using the unmergeCells method:
928
929 ```php
930 $objPHPExcel->getActiveSheet()->unmergeCells('A18:E22');
931 ```
932
933 ### Inserting rows/columns
934
935 You can insert/remove rows/columns at a specific position. The following code inserts 2 new rows, right before row 7:
936
937 ```php
938 $objPHPExcel->getActiveSheet()->insertNewRowBefore(7, 2);
939 ```
940
941 ### Add a drawing to a worksheet
942
943 A drawing is always represented as a separate object, which can be added to a worksheet. Therefore, you must first instantiate a new PHPExcel_Worksheet_Drawing, and assign its properties a meaningful value:
944
945 ```php
946 $objDrawing = new PHPExcel_Worksheet_Drawing();
947 $objDrawing->setName('Logo');
948 $objDrawing->setDescription('Logo');
949 $objDrawing->setPath('./images/officelogo.jpg');
950 $objDrawing->setHeight(36);
951 ```
952
953 To add the above drawing to the worksheet, use the following snippet of code. PHPExcel creates the link between the drawing and the worksheet:
954
955 ```php
956 $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
957 ```
958
959 You can set numerous properties on a drawing, here are some examples:
960
961 ```php
962 $objDrawing->setName('Paid');
963 $objDrawing->setDescription('Paid');
964 $objDrawing->setPath('./images/paid.png');
965 $objDrawing->setCoordinates('B15');
966 $objDrawing->setOffsetX(110);
967 $objDrawing->setRotation(25);
968 $objDrawing->getShadow()->setVisible(true);
969 $objDrawing->getShadow()->setDirection(45);
970 ```
971
972 You can also add images created using GD functions without needing to save them to disk first as In-Memory drawings.
973
974 ```php
975 //  Use GD to create an in-memory image
976 $gdImage = @imagecreatetruecolor(120, 20) or die('Cannot Initialize new GD image stream');
977 $textColor = imagecolorallocate($gdImage, 255, 255, 255);
978 imagestring($gdImage, 1, 5, 5,  'Created with PHPExcel', $textColor);
979
980 //  Add the In-Memory image to a worksheet
981 $objDrawing = new PHPExcel_Worksheet_MemoryDrawing();
982 $objDrawing->setName('In-Memory image 1');
983 $objDrawing->setDescription('In-Memory image 1');
984 $objDrawing->setCoordinates('A1');
985 $objDrawing->setImageResource($gdImage);
986 $objDrawing->setRenderingFunction(
987     PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG
988 );
989 $objDrawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT);
990 $objDrawing->setHeight(36);
991 $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
992 ```
993
994 ### Reading Images from a worksheet
995
996 A commonly asked question is how to retrieve the images from a workbook that has been loaded, and save them as individual image files to disk.
997
998 The following code extracts images from the current active worksheet, and writes each as a separate file.
999
1000 ```php
1001 $i = 0;
1002 foreach ($objPHPExcel->getActiveSheet()->getDrawingCollection() as $drawing) {
1003     if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
1004         ob_start();
1005         call_user_func(
1006             $drawing->getRenderingFunction(),
1007             $drawing->getImageResource()
1008         );
1009         $imageContents = ob_get_contents();
1010         ob_end_clean();
1011         switch ($drawing->getMimeType()) {
1012             case PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_PNG :
1013                 $extension = 'png'; 
1014                 break;
1015             case PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_GIF:
1016                 $extension = 'gif'; 
1017                 break;
1018             case PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_JPEG :
1019                 $extension = 'jpg'; 
1020                 break;
1021         }
1022     } else {
1023         $zipReader = fopen($drawing->getPath(),'r');
1024         $imageContents = '';
1025         while (!feof($zipReader)) {
1026             $imageContents .= fread($zipReader,1024);
1027         }
1028         fclose($zipReader);
1029         $extension = $drawing->getExtension();
1030     }
1031     $myFileName = '00_Image_'.++$i.'.'.$extension;
1032     file_put_contents($myFileName,$imageContents);
1033 }
1034 ```
1035
1036 ### Add rich text to a cell
1037
1038 Adding rich text to a cell can be done using PHPExcel_RichText instances. Here''s an example, which creates the following rich text string:
1039
1040  > This invoice is *__payable within thirty days after the end of the month__* unless specified otherwise on the invoice.
1041
1042 ```php
1043 $objRichText = new PHPExcel_RichText();
1044 $objRichText->createText('This invoice is ');
1045 $objPayable = $objRichText->createTextRun('payable within thirty days after the end of the month');
1046 $objPayable->getFont()->setBold(true);
1047 $objPayable->getFont()->setItalic(true);
1048 $objPayable->getFont()->setColor( new PHPExcel_Style_Color( PHPExcel_Style_Color::COLOR_DARKGREEN ) );
1049 $objRichText->createText(', unless specified otherwise on the invoice.');
1050 $objPHPExcel->getActiveSheet()->getCell('A18')->setValue($objRichText);
1051 ```
1052
1053 ### Define a named range
1054
1055 PHPExcel supports the definition of named ranges. These can be defined using the following code:
1056
1057 ```php
1058 // Add some data
1059 $objPHPExcel->setActiveSheetIndex(0);
1060 $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Firstname:');
1061 $objPHPExcel->getActiveSheet()->setCellValue('A2', 'Lastname:');
1062 $objPHPExcel->getActiveSheet()->setCellValue('B1', 'Maarten');
1063 $objPHPExcel->getActiveSheet()->setCellValue('B2', 'Balliauw');
1064
1065 // Define named ranges
1066 $objPHPExcel->addNamedRange( new PHPExcel_NamedRange('PersonFN', $objPHPExcel->getActiveSheet(), 'B1') );
1067 $objPHPExcel->addNamedRange( new PHPExcel_NamedRange('PersonLN', $objPHPExcel->getActiveSheet(), 'B2') );
1068 ```
1069
1070 Optionally, a fourth parameter can be passed defining the named range local (i.e. only usable on the current worksheet). Named ranges are global by default.
1071
1072 ### Redirect output to a client's web browser
1073
1074 Sometimes, one really wants to output a file to a client''s browser, especially when creating spreadsheets on-the-fly. There are some easy steps that can be followed to do this:
1075
1076  1. Create your PHPExcel spreadsheet
1077  2. Output HTTP headers for the type of document you wish to output
1078  3. Use the PHPExcel_Writer_* of your choice, and save to "php://output" 
1079
1080 PHPExcel_Writer_Excel2007 uses temporary storage when writing to php://output. By default, temporary files are stored in the script's working directory. When there is no access, it falls back to the operating system's temporary files location.
1081
1082 __This may not be safe for unauthorized viewing!__ 
1083 Depending on the configuration of your operating system, temporary storage can be read by anyone using the same temporary storage folder. When confidentiality of your document is needed, it is recommended not to use php://output.
1084
1085 #### HTTP headers
1086
1087 Example of a script redirecting an Excel 2007 file to the client's browser:
1088
1089 ```php
1090 /* Here there will be some code where you create $objPHPExcel */
1091
1092 // redirect output to client browser
1093 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
1094 header('Content-Disposition: attachment;filename="myfile.xlsx"');
1095 header('Cache-Control: max-age=0');
1096
1097 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
1098 $objWriter->save('php://output');
1099 ```
1100
1101 Example of a script redirecting an Excel5 file to the client's browser:
1102
1103 ```php
1104 /* Here there will be some code where you create $objPHPExcel */
1105
1106 // redirect output to client browser
1107 header('Content-Type: application/vnd.ms-excel');
1108 header('Content-Disposition: attachment;filename="myfile.xls"');
1109 header('Cache-Control: max-age=0');
1110
1111 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
1112 $objWriter->save('php://output');
1113 ```
1114
1115 **Caution:**
1116
1117 Make sure not to include any echo statements or output any other contents than the Excel file. There should be no whitespace before the opening <?php tag and at most one line break after the closing ?> tag (which can also be omitted to avoid problems). Make sure that your script is saved without a BOM (Byte-order mark) because this counts as echoing output. The same things apply to all included files.  
1118 Failing to follow the above guidelines may result in corrupt Excel files arriving at the client browser, and/or that headers cannot be set by PHP (resulting in warning messages).
1119
1120 ### Setting the default column width
1121
1122 Default column width can be set using the following code:
1123
1124 ```php
1125 $objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);
1126 ```
1127
1128 ### Setting the default row height
1129
1130 Default row height can be set using the following code:
1131
1132 ```php
1133 $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15);
1134 ```
1135
1136 ### Add a GD drawing to a worksheet
1137
1138 There might be a situation where you want to generate an in-memory image using GD and add it to a PHPExcel worksheet without first having to save this file to a temporary location.
1139
1140 Here''s an example which generates an image in memory and adds it to the active worksheet:
1141
1142 ```php
1143 // Generate an image
1144 $gdImage = @imagecreatetruecolor(120, 20) or die('Cannot Initialize new GD image stream');
1145 $textColor = imagecolorallocate($gdImage, 255, 255, 255);
1146 imagestring($gdImage, 1, 5, 5,  'Created with PHPExcel', $textColor);
1147
1148 // Add a drawing to the worksheet
1149 $objDrawing = new PHPExcel_Worksheet_MemoryDrawing();
1150 $objDrawing->setName('Sample image');
1151 $objDrawing->setDescription('Sample image');
1152 $objDrawing->setImageResource($gdImage);
1153 $objDrawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG);
1154 $objDrawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT);
1155 $objDrawing->setHeight(36);
1156 $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
1157 ```
1158
1159 ### Setting worksheet zoom level
1160
1161 To set a worksheet's zoom level, the following code can be used:
1162
1163 ```php
1164 $objPHPExcel->getActiveSheet()->getSheetView()->setZoomScale(75);
1165 ```
1166
1167 Note that zoom level should be in range 10 â€“ 400.
1168
1169 ### Sheet tab color
1170
1171 Sometimes you want to set a color for sheet tab. For example you can have a red sheet tab:
1172
1173 ```php
1174 $objWorksheet->getTabColor()->setRGB('FF0000');
1175 ```
1176
1177 ### Creating worksheets in a workbook
1178
1179 If you need to create more worksheets in the workbook, here is how:
1180
1181 ```php
1182 $objWorksheet1 = $objPHPExcel->createSheet();
1183 $objWorksheet1->setTitle('Another sheet');
1184 ```
1185
1186 Think of createSheet() as the "Insert sheet" button in Excel. When you hit that button a new sheet is appended to the existing collection of worksheets in the workbook.
1187
1188 ### Hidden worksheets (Sheet states)
1189
1190 Set a worksheet to be __hidden__ using this code:
1191
1192 ```php
1193 $objPHPExcel->getActiveSheet()
1194     ->setSheetState(PHPExcel_Worksheet::SHEETSTATE_HIDDEN);
1195 ```
1196
1197 Sometimes you may even want the worksheet to be __"very hidden"__. The available sheet states are :
1198
1199  - PHPExcel_Worksheet::SHEETSTATE_VISIBLE
1200  - PHPExcel_Worksheet::SHEETSTATE_HIDDEN
1201  - PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN
1202
1203 In Excel the sheet state "very hidden" can only be set programmatically, e.g. with Visual Basic Macro. It is not possible to make such a sheet visible via the user interface.
1204
1205 ### Right-to-left worksheet
1206
1207 Worksheets can be set individually whether column "A" should start at left or right side. Default is left. Here is how to set columns from right-to-left.
1208
1209 ```php
1210 // right-to-left worksheet
1211 $objPHPExcel->getActiveSheet()
1212     ->setRightToLeft(true);
1213 ```
1214