[재재업] 엑셀 출력시 글자수 제한 문제
본문
아래는 class.writeexcel_worksheet.inc 파일소스입니다..... 어떤부분을 수정해야 엑셀 출력시 글자가 안짤리고 모든 글자가 다나올까요?ㅠㅠ엑셀 출력시 한 셀에 들어가는 글자수가 제한되네여 ㅠㅠ
몇일째 해결못하고있네요...고수님들 부탁드립니다.
-------------------------------------------------------------------------------------
<?php
/*
* 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 *** 개인정보보호를 위한 전화번호 노출방지 *** USA
*/
/*
* This is the Spreadsheet::WriteExcel Perl package ported to PHP
* Spreadsheet::WriteExcel was written by John McNamara, *** 개인정보보호를 위한 이메일주소 노출방지 ***
*/
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<strlen($tmp);$c++) {
if ($c%16==0) {
print "\n";
}
printf("%02X ", ord($tmp[$c]));
}
print "\n";
}
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<strlen($tmp);$c++) {
if ($c%16==0) {
print "\n";
}
printf("%02X ", ord($tmp[$c]));
}
print "\n";
}
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<strlen($data);$c++) {
if ($c%16==0) {
print "\n";
}
printf("%02X ", ord($data[$c]));
}
print "\n";
}
# 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<sizeof($chars);$c++) {
$char=&$chars[$c];
$char = ord($char) << ++$i;
$low_15 = $char & 0x7fff;
$high_15 = $char & 0x7fff << 15;
$high_15 = $high_15 >> 15;
$char = $low_15 | $high_15;
}
$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
그누 근래 버전 부터 있는 PHPEXCEL 이란걸 이용해 보세요
기존 사용 하시던거 말고요 사용법은 구글 같은데 치시면 잘 아실수 있으실겁니다.
설마 $strmax 이부분을 수정안해보신건 아니겟지요?
소스를 봐선 별도의 제한 부분은 안보이는데요