[재재업] 엑셀 출력시 글자수 제한 문제
아래는 class.writeexcel_worksheet.inc 파일소스입니다..... 어떤부분을 수정해야 엑셀 출력시 글자가 안짤리고 모든 글자가 다나올까요?ㅠㅠ엑셀 출력시 한 셀에 들어가는 글자수가 제한되네여 ㅠㅠ
몇일째 해결못하고있네요...고수님들 부탁드립니다.
-------------------------------------------------------------------------------------
/* * Copyleft 2002 Johann Hanne * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA */
/* * This is the Spreadsheet::WriteExcel Perl package ported to PHP * Spreadsheet::WriteExcel was written by John McNamara, jmcnamara@cpan.org */
require_once "class.writeexcel_biffwriter.inc.php";
class writeexcel_worksheet extends writeexcel_biffwriter {
var $_name; var $_index; var $_activesheet; var $_firstsheet; var $_url_format; var $_parser; var $_tempdir;
var $_ext_sheets; var $_using_tmpfile; var $_tmpfilename; var $_filehandle; var $_fileclosed; var $_offset; var $_xls_rowmax; var $_xls_colmax; var $_xls_strmax; var $_dim_rowmin; var $_dim_rowmax; var $_dim_colmin; var $_dim_colmax; var $_colinfo; var $_selection; var $_panes; var $_active_pane; var $_frozen; var $_selected;
var $_paper_size; var $_orientation; var $_header; var $_footer; var $_hcenter; var $_vcenter; var $_margin_head; var $_margin_foot; var $_margin_left; var $_margin_right; var $_margin_top; var $_margin_bottom;
var $_title_rowmin; var $_title_rowmax; var $_title_colmin; var $_title_colmax; var $_print_rowmin; var $_print_rowmax; var $_print_colmin; var $_print_colmax;
var $_print_gridlines; var $_screen_gridlines; var $_print_headers;
var $_fit_page; var $_fit_width; var $_fit_height;
var $_hbreaks; var $_vbreaks;
var $_protect; var $_password;
var $_col_sizes; var $_row_sizes;
var $_col_formats; var $_row_formats;
var $_zoom; var $_print_scale;
var $_debug;
/* * Constructor. Creates a new Worksheet object from a BIFFwriter object */ function writeexcel_worksheet($name, $index, &$activesheet, &$firstsheet, &$url_format, &$parser, $tempdir) {
$this->writeexcel_biffwriter();
$rowmax = 65536; // 16384 in Excel 5 $colmax = 256; $strmax = 255;
$this->_name = $name; $this->_index = $index; $this->_activesheet = &$activesheet; $this->_firstsheet = &$firstsheet; $this->_url_format = &$url_format; $this->_parser = &$parser; $this->_tempdir = $tempdir;
$this->_ext_sheets = array(); $this->_using_tmpfile = 1; $this->_tmpfilename = false; $this->_filehandle = false; $this->_fileclosed = 0; $this->_offset = 0; $this->_xls_rowmax = $rowmax; $this->_xls_colmax = $colmax; $this->_xls_strmax = $strmax; $this->_dim_rowmin = $rowmax +1; $this->_dim_rowmax = 0; $this->_dim_colmin = $colmax +1; $this->_dim_colmax = 0; $this->_colinfo = array(); $this->_selection = array(0, 0); $this->_panes = array(); $this->_active_pane = 3; $this->_frozen = 0; $this->_selected = 0;
$this->_paper_size = 0x0; $this->_orientation = 0x1; $this->_header = ''; $this->_footer = ''; $this->_hcenter = 0; $this->_vcenter = 0; $this->_margin_head = 0.50; $this->_margin_foot = 0.50; $this->_margin_left = 0.75; $this->_margin_right = 0.75; $this->_margin_top = 1.00; $this->_margin_bottom = 1.00;
$this->_title_rowmin = false; $this->_title_rowmax = false; $this->_title_colmin = false; $this->_title_colmax = false; $this->_print_rowmin = false; $this->_print_rowmax = false; $this->_print_colmin = false; $this->_print_colmax = false;
$this->_print_gridlines = 1; $this->_screen_gridlines = 1; $this->_print_headers = 0;
$this->_fit_page = 0; $this->_fit_width = 0; $this->_fit_height = 0;
$this->_hbreaks = array(); $this->_vbreaks = array();
$this->_protect = 0; $this->_password = false;
$this->_col_sizes = array(); $this->_row_sizes = array();
$this->_col_formats = array(); $this->_row_formats = array();
$this->_zoom = 100; $this->_print_scale = 100;
$this->_initialize(); }
############################################################################### # # _initialize() # # Open a tmp file to store the majority of the Worksheet data. If this fails, # for example due to write permissions, store the data in memory. This can be # slow for large files. # function _initialize() {
# Open tmp file for storing Worksheet data. $this->_tmpfilename=tempnam($this->_tempdir, "php_writeexcel"); $fh=fopen($this->_tmpfilename, "w+b");
if ($fh) { # Store filehandle $this->_filehandle = $fh; } else { # If tempfile() failed store data in memory $this->_using_tmpfile = 0; $this->_tmpfilename=false;
if ($this->_index == 0) { $dir = $this->_tempdir;
//todo warn "Unable to create temp files in $dir. Refer to set_tempdir()". // " in the Spreadsheet::WriteExcel documentation.\n" ; } } }
/* * Add data to the beginning of the workbook (note the reverse order) * and to the end of the workbook. */ function _close($sheetnames) {
/////////////////////////////// // Prepend in reverse order!! //
$this->_store_dimensions(); // Prepend the sheet dimensions $this->_store_password(); // Prepend the sheet password $this->_store_protect(); // Prepend the sheet protection $this->_store_setup(); // Prepend the page setup $this->_store_margin_bottom(); // Prepend the bottom margin $this->_store_margin_top(); // Prepend the top margin $this->_store_margin_right(); // Prepend the right margin $this->_store_margin_left(); // Prepend the left margin $this->_store_vcenter(); // Prepend the page vertical // centering $this->_store_hcenter(); // Prepend the page horizontal // centering $this->_store_footer(); // Prepend the page footer $this->_store_header(); // Prepend the page header $this->_store_vbreak(); // Prepend the vertical page breaks $this->_store_hbreak(); // Prepend the horizontal // page breaks $this->_store_wsbool(); // Prepend WSBOOL $this->_store_gridset(); // Prepend GRIDSET $this->_store_print_gridlines(); // Prepend PRINTGRIDLINES $this->_store_print_headers(); // Prepend PRINTHEADERS
// Prepend EXTERNSHEET references $num_sheets = sizeof($sheetnames); for ($i = $num_sheets; $i > 0; $i--) { $sheetname = $sheetnames[$i-1]; $this->_store_externsheet($sheetname); }
$this->_store_externcount($num_sheets); // Prepend the EXTERNCOUNT // of external references.
// Prepend the COLINFO records if they exist if (sizeof($this->_colinfo)>0){ while (sizeof($this->_colinfo)>0) { $arrayref = array_pop ($this->_colinfo); $this->_store_colinfo($arrayref); } $this->_store_defcol(); }
$this->_store_bof(0x0010); // Prepend the BOF record
// // End of prepend. Read upwards from here. ////////////////////////////////////////////
// Append $this->_store_window2(); $this->_store_zoom();
if (sizeof($this->_panes)>0) { $this->_store_panes($this->_panes); }
$this->_store_selection($this->_selection); $this->_store_eof(); }
/* * Retrieve the worksheet name. */ function get_name() { return $this->_name; }
############################################################################### # # get_data(). # # Retrieves data from memory in one chunk, or from disk in $buffer # sized chunks. # function get_data() {
$buffer = 4096;
# Return data stored in memory if ($this->_data!==false) { $tmp=$this->_data; $this->_data=false;
// The next data comes from the temporary file, so prepare // it by putting the file pointer to the beginning if ($this->_using_tmpfile) { fseek($this->_filehandle, 0, SEEK_SET); }
if ($this->_debug) {
print "*** worksheet::get_data() called (1):";
for ($c=0;$c return $tmp;
} # Return data stored on disk
if ($this->_using_tmpfile) {
if ($tmp=fread($this->_filehandle, $buffer)) { if ($this->_debug) {
print "*** worksheet::get_data() called (2):";
for ($c=0;$c return $tmp;
}
} # No more data to return
return false;
} /* Remove the temporary file */
function cleanup() {
if ($this->_using_tmpfile) {
fclose($this->_filehandle);
unlink($this->_tmpfilename);
$this->_tmpfilename=false;
$this->_using_tmpfile=false;
}
} /*
* Set this worksheet as a selected worksheet, i.e. the worksheet has
* its tab highlighted.
*/
function select() {
$this->_selected = 1;
} /*
* Set this worksheet as the active worksheet, i.e. the worksheet
* that is displayed when the workbook is opened. Also set it as
* selected.
*/
function activate() {
$this->_selected = 1;
$this->_activesheet = $this->_index;
} /*
* Set this worksheet as the first visible sheet. This is necessary
* when there are a large number of worksheets and the activated
* worksheet is not visible on the screen.
*/
function set_first_sheet() {
$this->_firstsheet = $this->_index;
} /*
* Set the worksheet protection flag to prevent accidental modification
* and to hide formulas if the locked and hidden format properties have
* been set.
*/
function protect($password) {
$this->_protect = 1;
$this->_password = $this->_encode_password($password);
} ###############################################################################
#
# set_column($firstcol, $lastcol, $width, $format, $hidden)
#
# Set the width of a single column or a range of column.
# See also: _store_colinfo
#
function set_column() { $_=func_get_args(); $cell = $_[0]; # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $cell)) {
$_ = $this->_substitute_cellref($_);
} array_push($this->_colinfo, $_); # Store the col sizes for use when calculating image vertices taking
# hidden columns into account. Also store the column formats.
#
if (sizeof($_)<3) {
# Ensure at least $firstcol, $lastcol and $width
return;
} $width = $_[4] ? 0 : $_[2]; # Set width to zero if column is hidden
$format = $_[3]; list($firstcol, $lastcol) = $_; for ($col=$firstcol;$col<=$lastcol;$col++) {
$this->_col_sizes[$col] = $width;
if ($format) {
$this->_col_formats[$col] = $format;
}
}
} ###############################################################################
#
# set_selection()
#
# Set which cell or cells are selected in a worksheet: see also the
# function _store_selection
#
function set_selection() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} $this->_selection = $_;
} ###############################################################################
#
# freeze_panes()
#
# Set panes and mark them as frozen. See also _store_panes().
#
function freeze_panes() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} $this->_frozen = 1;
$this->_panes = $_;
} ###############################################################################
#
# thaw_panes()
#
# Set panes and mark them as unfrozen. See also _store_panes().
#
function thaw_panes() { $_=func_get_args(); $this->_frozen = 0;
$this->_panes = $_;
} /*
* Set the page orientation as portrait.
*/
function set_portrait() {
$this->_orientation = 1;
} /*
* Set the page orientation as landscape.
*/
function set_landscape() {
$this->_orientation = 0;
} /*
* Set the paper type. Ex. 1 = US Letter, 9 = A4
*/
function set_paper($type) {
$this->_paper_size = $type;
} /*
* Set the page header caption and optional margin.
*/
function set_header($string, $margin) { if (strlen($string) >= 255) {
trigger_error("Header string must be less than 255 characters",
E_USER_WARNING);
return;
} $this->_header = $string;
$this->_margin_head = $margin;
} /*
* Set the page footer caption and optional margin.
*/
function set_footer($string, $margin) {
if (strlen($string) >= 255) {
trigger_error("Footer string must be less than 255 characters",
E_USER_WARNING);
return;
} $this->_footer = $string;
$this->_margin_foot = $margin;
} /*
* Center the page horizontally.
*/
function center_horizontally($hcenter=1) {
$this->_hcenter = $hcenter;
} /*
* Center the page horizontally.
*/
function center_vertically($vcenter=1) {
$this->_vcenter = $vcenter;
} /*
* Set all the page margins to the same value in inches.
*/
function set_margins($margin) {
$this->set_margin_left($margin);
$this->set_margin_right($margin);
$this->set_margin_top($margin);
$this->set_margin_bottom($margin);
} /*
* Set the left and right margins to the same value in inches.
*/
function set_margins_LR($margin) {
$this->set_margin_left($margin);
$this->set_margin_right($margin);
} /*
* Set the top and bottom margins to the same value in inches.
*/
function set_margins_TB($margin) {
$this->set_margin_top($margin);
$this->set_margin_bottom($margin);
} /*
* Set the left margin in inches.
*/
function set_margin_left($margin=0.75) {
$this->_margin_left = $margin;
} /*
* Set the right margin in inches.
*/
function set_margin_right($margin=0.75) {
$this->_margin_right = $margin;
} /*
* Set the top margin in inches.
*/
function set_margin_top($margin=1.00) {
$this->_margin_top = $margin;
} /*
* Set the bottom margin in inches.
*/
function set_margin_bottom($margin=1.00) {
$this->_margin_bottom = $margin;
} ###############################################################################
#
# repeat_rows($first_row, $last_row)
#
# Set the rows to repeat at the top of each printed page. See also the
# _store_name_xxxx() methods in Workbook.pm.
#
function repeat_rows() { $_=func_get_args(); $this->_title_rowmin = $_[0];
$this->_title_rowmax = isset($_[1]) ? $_[1] : $_[0]; # Second row is optional
} ###############################################################################
#
# repeat_columns($first_col, $last_col)
#
# Set the columns to repeat at the left hand side of each printed page.
# See also the _store_names() methods in Workbook.pm.
#
function repeat_columns() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} $this->_title_colmin = $_[0];
$this->_title_colmax = isset($_[1]) ? $_[1] : $_[0]; # Second col is optional
} ###############################################################################
#
# print_area($first_row, $first_col, $last_row, $last_col)
#
# Set the area of each worksheet that will be printed. See also the
# _store_names() methods in Workbook.pm.
#
function print_area() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} if (sizeof($_) != 4) {
# Require 4 parameters
return;
} $this->_print_rowmin = $_[0];
$this->_print_colmin = $_[1];
$this->_print_rowmax = $_[2];
$this->_print_colmax = $_[3];
} /*
* Set the option to hide gridlines on the screen and the printed page.
* There are two ways of doing this in the Excel BIFF format: The first
* is by setting the DspGrid field of the WINDOW2 record, this turns off
* the screen and subsequently the print gridline. The second method is
* to via the PRINTGRIDLINES and GRIDSET records, this turns off the
* printed gridlines only. The first method is probably sufficient for
* most cases. The second method is supported for backwards compatibility.
*/
function hide_gridlines($option=1) {
if ($option == 0) {
$this->_print_gridlines = 1; # 1 = display, 0 = hide
$this->_screen_gridlines = 1;
} elseif ($option == 1) {
$this->_print_gridlines = 0;
$this->_screen_gridlines = 1;
} else {
$this->_print_gridlines = 0;
$this->_screen_gridlines = 0;
}
} /*
* Set the option to print the row and column headers on the printed page.
* See also the _store_print_headers() method below.
*/
function print_row_col_headers($headers=1) {
$this->_print_headers = $headers;
} /*
* Store the vertical and horizontal number of pages that will define
* the maximum area printed. See also _store_setup() and _store_wsbool()
* below.
*/
function fit_to_pages($width, $height) {
$this->_fit_page = 1;
$this->_fit_width = $width;
$this->_fit_height = $height;
} /*
* Store the horizontal page breaks on a worksheet.
*/
function set_h_pagebreaks($breaks) {
$this->_hbreaks=array_merge($this->_hbreaks, $breaks);
} /*
* Store the vertical page breaks on a worksheet.
*/
function set_v_pagebreaks($breaks) {
$this->_vbreaks=array_merge($this->_vbreaks, $breaks);
} /*
* Set the worksheet zoom factor.
*/
function set_zoom($scale=100) {
// Confine the scale to Excel's range
if ($scale < 10 || $scale > 400) {
trigger_error("Zoom factor $scale outside range: ".
"10 <= zoom <= 400", E_USER_WARNING);
$scale = 100;
} $this->_zoom = $scale;
} /*
* Set the scale factor for the printed page.
*/
function set_print_scale($scale=100) {
// Confine the scale to Excel's range
if ($scale < 10 || $scale > 400) {
trigger_error("Print scale $scale outside range: ".
"10 <= zoom <= 400", E_USER_WARNING);
$scale = 100;
} // Turn off "fit to page" option
$this->_fit_page = 0; $this->_print_scale = $scale;
} ###############################################################################
#
# write($row, $col, $token, $format)
#
# Parse $token call appropriate write method. $row and $column are zero
# indexed. $format is optional.
#
# Returns: return value of called subroutine
#
function write() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} $token = $_[2]; # Match an array ref.
if (is_array($token)) {
return call_user_func_array(array(&$this, 'write_row'), $_);
} # Match number
if (preg_match('/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/', $token)) {
return call_user_func_array(array(&$this, 'write_number'), $_);
}
# Match http, https or ftp URL
elseif (preg_match('|^[fh]tt?ps?://|', $token)) {
return call_user_func_array(array(&$this, 'write_url'), $_);
}
# Match mailto:
elseif (preg_match('/^mailto:/', $token)) {
return call_user_func_array(array(&$this, 'write_url'), $_);
}
# Match internal or external sheet link
elseif (preg_match('[^(?:in|ex)ternal:]', $token)) {
return call_user_func_array(array(&$this, 'write_url'), $_);
}
# Match formula
elseif (preg_match('/^=/', $token)) {
return call_user_func_array(array(&$this, 'write_formula'), $_);
}
# Match blank
elseif ($token == '') {
array_splice($_, 2, 1); # remove the empty string from the parameter list
return call_user_func_array(array(&$this, 'write_blank'), $_);
}
# Default: match string
else {
return call_user_func_array(array(&$this, 'write_string'), $_);
}
} ###############################################################################
#
# write_row($row, $col, $array_ref, $format)
#
# Write a row of data starting from ($row, $col). Call write_col() if any of
# the elements of the array ref are in turn array refs. This allows the writing
# of 1D or 2D arrays of data in one go.
#
# Returns: the first encountered error value or zero for no errors
#
function write_row() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} # Catch non array refs passed by user.
if (!is_array($_[2])) {
trigger_error("Not an array ref in call to write_row()!", E_USER_ERROR);
} list($row, $col, $tokens)=array_splice($_, 0, 3);
$options = $_[0];
$error = 0; foreach ($tokens as $token) { # Check for nested arrays
if (is_array($token)) {
$ret = $this->write_col($row, $col, $token, $options);
} else {
$ret = $this->write ($row, $col, $token, $options);
} # Return only the first error encountered, if any.
$error = $error || $ret;
$col++;
} return $error;
} ###############################################################################
#
# _XF()
#
# Returns an index to the XF record in the workbook.
# TODO
#
# Note: this is a function, not a method.
#
function _XF($row=false, $col=false, $format=false) { if ($format) {
return $format->get_xf_index();
} elseif (isset($this->_row_formats[$row])) {
return $this->_row_formats[$row]->get_xf_index();
} elseif (isset($this->_col_formats[$col])) {
return $this->_col_formats[$col]->get_xf_index();
} else {
return 0x0F;
}
} ###############################################################################
#
# write_col($row, $col, $array_ref, $format)
#
# Write a column of data starting from ($row, $col). Call write_row() if any of
# the elements of the array ref are in turn array refs. This allows the writing
# of 1D or 2D arrays of data in one go.
#
# Returns: the first encountered error value or zero for no errors
#
function write_col() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} # Catch non array refs passed by user.
if (!is_array($_[2])) {
trigger_error("Not an array ref in call to write_row()!", E_USER_ERROR);
} $row = array_shift($_);
$col = array_shift($_);
$tokens = array_shift($_);
$options = $_; $error = 0; foreach ($tokens as $token) { # write() will deal with any nested arrays
$ret = $this->write($row, $col, $token, $options); # Return only the first error encountered, if any.
$error = $error || $ret;
$row++;
} return $error;
} ###############################################################################
###############################################################################
#
# Internal methods
# ###############################################################################
#
# _append(), overloaded.
#
# Store Worksheet data in memory using the base class _append() or to a
# temporary file, the default.
#
function _append($data) { if (func_num_args()>1) {
trigger_error("writeexcel_worksheet::_append() ".
"called with more than one argument", E_USER_ERROR);
} if ($this->_using_tmpfile) { if ($this->_debug) {
print "worksheet::_append() called:";
for ($c=0;$c # Add CONTINUE records if necessary
if (strlen($data) > $this->_limit) {
$data = $this->_add_continue($data);
} fputs($this->_filehandle, $data);
$this->_datasize += strlen($data);
} else {
parent::_append($data);
}
} ###############################################################################
#
# _substitute_cellref()
#
# Substitute an Excel cell reference in A1 notation for zero based row and
# column values in an argument list.
#
# Ex: ("A4", "Hello") is converted to (3, 0, "Hello").
#
// Exactly one array must be passed!
function _substitute_cellref($_) {
$cell = strtoupper(array_shift($_)); # Convert a column range: 'A:A' or 'B:G'
if (preg_match('/([A-I]?[A-Z]):([A-I]?[A-Z])/', $cell, $reg)) {
list($dummy, $col1) = $this->_cell_to_rowcol($reg[1] .'1'); # Add a dummy row
list($dummy, $col2) = $this->_cell_to_rowcol($reg[2] .'1'); # Add a dummy row
return array_merge(array($col1, $col2), $_);
} # Convert a cell range: 'A1:B7'
if (preg_match('/\$?([A-I]?[A-Z]\$?\d+):\$?([A-I]?[A-Z]\$?\d+)/', $cell, $reg)) {
list($row1, $col1) = $this->_cell_to_rowcol($reg[1]);
list($row2, $col2) = $this->_cell_to_rowcol($reg[2]);
return array_merge(array($row1, $col1, $row2, $col2), $_);
} # Convert a cell reference: 'A1' or 'AD2000'
if (preg_match('/\$?([A-I]?[A-Z]\$?\d+)/', $cell, $reg)) {
list($row1, $col1) = $this->_cell_to_rowcol($reg[1]);
return array_merge(array($row1, $col1), $_); } trigger_error("Unknown cell reference $cell", E_USER_ERROR);
} ###############################################################################
#
# _cell_to_rowcol($cell_ref)
#
# Convert an Excel cell reference in A1 notation to a zero based row and column
# reference; converts C1 to (0, 2).
#
# Returns: row, column
#
# TODO use functions in Utility.pm
#
function _cell_to_rowcol($cell) { preg_match('/\$?([A-I]?[A-Z])\$?(\d+)/', $cell, $reg); $col = $reg[1];
$row = $reg[2]; # Convert base26 column string to number
# All your Base are belong to us.
$chars = preg_split('//', $col, -1, PREG_SPLIT_NO_EMPTY);
$expn = 0;
$col = 0; while (sizeof($chars)) {
$char = array_pop($chars); # LS char first
$col += (ord($char) -ord('A') +1) * pow(26, $expn);
$expn++;
} # Convert 1-index to zero-index
$row--;
$col--; return array($row, $col);
} /*
* This is an internal method that is used to filter elements of the
* array of pagebreaks used in the _store_hbreak() and _store_vbreak()
* methods. It:
* 1. Removes duplicate entries from the list.
* 2. Sorts the list.
* 3. Removes 0 from the list if present.
*/
function _sort_pagebreaks($breaks) {
// Hash slice to remove duplicates
foreach ($breaks as $break) {
$hash["$break"]=1;
} // Numerical sort
$breaks=array_keys($hash);
sort($breaks, SORT_NUMERIC); // Remove zero
if ($breaks[0] == 0) {
array_shift($breaks);
} // 1000 vertical pagebreaks appears to be an internal Excel 5 limit.
// It is slightly higher in Excel 97/200, approx. 1026
if (sizeof($breaks) > 1000) {
array_splice($breaks, 1000);
} return $breaks;
} /*
* Based on the algorithm provided by Daniel Rentz of OpenOffice.
*/
function _encode_password($plaintext) {
$chars=preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY);
$count=sizeof($chars);
$i=0; for ($c=0;$c $password = 0x0000; foreach ($chars as $char) {
$password ^= $char;
} $password ^= $count;
$password ^= 0xCE4B; return $password;
} ###############################################################################
###############################################################################
#
# BIFF RECORDS
# ###############################################################################
#
# write_number($row, $col, $num, $format)
#
# Write a double to the specified row and column (zero indexed).
# An integer can be written as a double. Excel will display an
# integer. $format is optional.
#
# Returns 0 : normal termination
# -1 : insufficient number of arguments
# -2 : row or column out of range
#
function write_number() { $_=func_get_args(); # Check for a cell reference in A1 notation and substitute row and column
if (preg_match('/^\D/', $_[0])) {
$_ = $this->_substitute_cellref($_);
} # Check the number of args
if (sizeof($_) < 3) {
return -1;
} $record = 0x0203; # Record identifier
$length = 0x000E; # Number of bytes to follow $row = $_[0]; # Zero indexed row
$col = $_[1]; # Zero indexed column
$num = $_[2];
//!!!
$xf = $this->_XF($row, $col, $_[3]); # The cell format # Check that row and col are valid and store max and min values
if ($row >= $this->_xls_rowmax) { return -2; }
if ($col >= $this->_xls_colmax) { return -2; }
if ($row < $this->_dim_rowmin) { $this->_dim_rowmin = $row; }
if ($row > $this->_dim_rowmax) { $this->_dim_rowmax = $row; }
if ($col < $this->_dim_colmin) { $this->_dim_colmin = $col; }
if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } $header = pack("vv", $record, $length);
$data = pack("vvv", $row, $col, $xf);
$xl_double = pack("d", $num); if ($this->_byte_order) {
//TODO
$xl_double = strrev($xl_double);
} $this->_append($header . $data . $xl_double); return 0;
} ###############################################################################
#
# write_string ($row, $col, $string, $format)
#
# Write a string to the specified row and column (zero indexed).
# NOTE: there is an Excel 5 defined limit of 255 characters.
# $format is optional.
# Returns 0 : normal termination
# -1 : insufficient number of arguments
# -2 : row or column out of range
#
답변 2개
답변에 대한 댓글 1개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인