Reportes en Excel con PHP y MySQL

Compartir

reporte_excel

En este tutorial les mostrare como  crear un reporte en Excel con PHP y una base de datos MySQL,  para ello utilizaremos la  librería  PHPExcel.

¿Qué es PHPExcel?

Es un proyecto de proporciona un conjunto de clases para el lenguaje de programación PHP, que le permiten escribir y leer de diferentes formatos de archivo de hoja de cálculo , como Excel ( BIFF ) .xls , Excel 2007 ( .xlsx ) OfficeOpenXML , CSV, Libre / .ods OpenOffice Calc , Gnumeric , PDF , HTML , ... Este proyecto se basa en estándar OpenXML de Microsoft y PHP .

¿Qué haremos?

En este ejemplo extraeremos de una base de datos MySQL un listado de países ordenados por nombre del país, dichos datos serán presentados en una hoja de cálculo de Excel, para mostrar información relacionad al país, como lo es: el código del país, nombre, el código de la moneda, capital y el continente al que pertenece.

Base de datos:

-- phpMyAdmin SQL Dump
-- version 4.2.11
-- http://www.phpmyadmin.net
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 12-06-2015 a las 19:06:10
-- Versión del servidor: 5.6.21
-- Versión de PHP: 5.6.3

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */;

-- -- Base de datos: `test` --

-- --------------------------------------------------------

-- -- Estructura de tabla para la tabla `countries` --

CREATE TABLE IF NOT EXISTS `countries` ( `id` int(5) NOT NULL, `countryCode` char(2) NOT NULL DEFAULT '', `countryName` varchar(45) NOT NULL DEFAULT '', `currencyCode` char(3) DEFAULT NULL, `capital` varchar(30) DEFAULT NULL, `continentName` varchar(15) DEFAULT NULL ) ENGINE=MyISAM AUTO_INCREMENT=251 DEFAULT CHARSET=utf8;

-- -- Volcado de datos para la tabla `countries` --

INSERT INTO `countries` (`id`, `countryCode`, `countryName`, `currencyCode`, `capital`, `continentName`) VALUES (1, 'AD', 'Andorra', 'EUR', 'Andorra la Vella', 'Europe'), (2, 'AE', 'United Arab Emirates', 'AED', 'Abu Dhabi', 'Asia'), (3, 'AF', 'Afghanistan', 'AFN', 'Kabul', 'Asia'), (4, 'AG', 'Antigua and Barbuda', 'XCD', 'St. John''s', 'North America'), (5, 'AI', 'Anguilla', 'XCD', 'The Valley', 'North America'), (6, 'AL', 'Albania', 'ALL', 'Tirana', 'Europe'), (7, 'AM', 'Armenia', 'AMD', 'Yerevan', 'Asia'), (8, 'AO', 'Angola', 'AOA', 'Luanda', 'Africa'), (9, 'AQ', 'Antarctica', '', '', 'Antarctica'), (10, 'AR', 'Argentina', 'ARS', 'Buenos Aires', 'South America'), (11, 'AS', 'American Samoa', 'USD', 'Pago Pago', 'Oceania'), (12, 'AT', 'Austria', 'EUR', 'Vienna', 'Europe'), (13, 'AU', 'Australia', 'AUD', 'Canberra', 'Oceania'), (14, 'AW', 'Aruba', 'AWG', 'Oranjestad', 'North America'), (15, 'AX', 'Åland', 'EUR', 'Mariehamn', 'Europe'), (16, 'AZ', 'Azerbaijan', 'AZN', 'Baku', 'Asia'), (17, 'BA', 'Bosnia and Herzegovina', 'BAM', 'Sarajevo', 'Europe'), (18, 'BB', 'Barbados', 'BBD', 'Bridgetown', 'North America'), (19, 'BD', 'Bangladesh', 'BDT', 'Dhaka', 'Asia'), (20, 'BE', 'Belgium', 'EUR', 'Brussels', 'Europe'), (21, 'BF', 'Burkina Faso', 'XOF', 'Ouagadougou', 'Africa'), (22, 'BG', 'Bulgaria', 'BGN', 'Sofia', 'Europe'), (23, 'BH', 'Bahrain', 'BHD', 'Manama', 'Asia'), (24, 'BI', 'Burundi', 'BIF', 'Bujumbura', 'Africa'), (25, 'BJ', 'Benin', 'XOF', 'Porto-Novo', 'Africa'), (26, 'BL', 'Saint Barthélemy', 'EUR', 'Gustavia', 'North America'), (27, 'BM', 'Bermuda', 'BMD', 'Hamilton', 'North America'), (28, 'BN', 'Brunei', 'BND', 'Bandar Seri Begawan', 'Asia'), (29, 'BO', 'Bolivia', 'BOB', 'Sucre', 'South America'), (30, 'BQ', 'Bonaire', 'USD', '', 'North America'), (31, 'BR', 'Brazil', 'BRL', 'Brasília', 'South America'), (32, 'BS', 'Bahamas', 'BSD', 'Nassau', 'North America'), (33, 'BT', 'Bhutan', 'BTN', 'Thimphu', 'Asia'), (34, 'BV', 'Bouvet Island', 'NOK', '', 'Antarctica'), (35, 'BW', 'Botswana', 'BWP', 'Gaborone', 'Africa'), (36, 'BY', 'Belarus', 'BYR', 'Minsk', 'Europe'), (37, 'BZ', 'Belize', 'BZD', 'Belmopan', 'North America'), (38, 'CA', 'Canada', 'CAD', 'Ottawa', 'North America'), (39, 'CC', 'Cocos [Keeling] Islands', 'AUD', 'West Island', 'Asia'), (40, 'CD', 'Democratic Republic of the Congo', 'CDF', 'Kinshasa', 'Africa'), (41, 'CF', 'Central African Republic', 'XAF', 'Bangui', 'Africa'), (42, 'CG', 'Republic of the Congo', 'XAF', 'Brazzaville', 'Africa'), (43, 'CH', 'Switzerland', 'CHF', 'Berne', 'Europe'), (44, 'CI', 'Ivory Coast', 'XOF', 'Yamoussoukro', 'Africa'), (45, 'CK', 'Cook Islands', 'NZD', 'Avarua', 'Oceania'), (46, 'CL', 'Chile', 'CLP', 'Santiago', 'South America'), (47, 'CM', 'Cameroon', 'XAF', 'Yaoundé', 'Africa'), (48, 'CN', 'China', 'CNY', 'Beijing', 'Asia'), (49, 'CO', 'Colombia', 'COP', 'Bogotá', 'South America'), (50, 'CR', 'Costa Rica', 'CRC', 'San José', 'North America'), (51, 'CU', 'Cuba', 'CUP', 'Havana', 'North America'), (52, 'CV', 'Cape Verde', 'CVE', 'Praia', 'Africa'), (53, 'CW', 'Curacao', 'ANG', 'Willemstad', 'North America'), (54, 'CX', 'Christmas Island', 'AUD', 'The Settlement', 'Asia'), (55, 'CY', 'Cyprus', 'EUR', 'Nicosia', 'Europe'), (56, 'CZ', 'Czech Republic', 'CZK', 'Prague', 'Europe'), (57, 'DE', 'Germany', 'EUR', 'Berlin', 'Europe'), (58, 'DJ', 'Djibouti', 'DJF', 'Djibouti', 'Africa'), (59, 'DK', 'Denmark', 'DKK', 'Copenhagen', 'Europe'), (60, 'DM', 'Dominica', 'XCD', 'Roseau', 'North America'), (61, 'DO', 'Dominican Republic', 'DOP', 'Santo Domingo', 'North America'), (62, 'DZ', 'Algeria', 'DZD', 'Algiers', 'Africa'), (63, 'EC', 'Ecuador', 'USD', 'Quito', 'South America'), (64, 'EE', 'Estonia', 'EUR', 'Tallinn', 'Europe'), (65, 'EG', 'Egypt', 'EGP', 'Cairo', 'Africa'), (66, 'EH', 'Western Sahara', 'MAD', 'El Aaiún', 'Africa'), (67, 'ER', 'Eritrea', 'ERN', 'Asmara', 'Africa'), (68, 'ES', 'Spain', 'EUR', 'Madrid', 'Europe'), (69, 'ET', 'Ethiopia', 'ETB', 'Addis Ababa', 'Africa'), (70, 'FI', 'Finland', 'EUR', 'Helsinki', 'Europe'), (71, 'FJ', 'Fiji', 'FJD', 'Suva', 'Oceania'), (72, 'FK', 'Falkland Islands', 'FKP', 'Stanley', 'South America'), (73, 'FM', 'Micronesia', 'USD', 'Palikir', 'Oceania'), (74, 'FO', 'Faroe Islands', 'DKK', 'Tórshavn', 'Europe'), (75, 'FR', 'France', 'EUR', 'Paris', 'Europe'), (76, 'GA', 'Gabon', 'XAF', 'Libreville', 'Africa'), (77, 'GB', 'United Kingdom', 'GBP', 'London', 'Europe'), (78, 'GD', 'Grenada', 'XCD', 'St. George''s', 'North America'), (79, 'GE', 'Georgia', 'GEL', 'Tbilisi', 'Asia'), (80, 'GF', 'French Guiana', 'EUR', 'Cayenne', 'South America'), (81, 'GG', 'Guernsey', 'GBP', 'St Peter Port', 'Europe'), (82, 'GH', 'Ghana', 'GHS', 'Accra', 'Africa'), (83, 'GI', 'Gibraltar', 'GIP', 'Gibraltar', 'Europe'), (84, 'GL', 'Greenland', 'DKK', 'Nuuk', 'North America'), (85, 'GM', 'Gambia', 'GMD', 'Banjul', 'Africa'), (86, 'GN', 'Guinea', 'GNF', 'Conakry', 'Africa'), (87, 'GP', 'Guadeloupe', 'EUR', 'Basse-Terre', 'North America'), (88, 'GQ', 'Equatorial Guinea', 'XAF', 'Malabo', 'Africa'), (89, 'GR', 'Greece', 'EUR', 'Athens', 'Europe'), (90, 'GS', 'South Georgia and the South Sandwich Islands', 'GBP', 'Grytviken', 'Antarctica'), (91, 'GT', 'Guatemala', 'GTQ', 'Guatemala City', 'North America'), (92, 'GU', 'Guam', 'USD', 'Hagåtña', 'Oceania'), (93, 'GW', 'Guinea-Bissau', 'XOF', 'Bissau', 'Africa'), (94, 'GY', 'Guyana', 'GYD', 'Georgetown', 'South America'), (95, 'HK', 'Hong Kong', 'HKD', 'Hong Kong', 'Asia'), (96, 'HM', 'Heard Island and McDonald Islands', 'AUD', '', 'Antarctica'), (97, 'HN', 'Honduras', 'HNL', 'Tegucigalpa', 'North America'), (98, 'HR', 'Croatia', 'HRK', 'Zagreb', 'Europe'), (99, 'HT', 'Haiti', 'HTG', 'Port-au-Prince', 'North America'), (100, 'HU', 'Hungary', 'HUF', 'Budapest', 'Europe'), (101, 'ID', 'Indonesia', 'IDR', 'Jakarta', 'Asia'), (102, 'IE', 'Ireland', 'EUR', 'Dublin', 'Europe'), (103, 'IL', 'Israel', 'ILS', '', 'Asia'), (104, 'IM', 'Isle of Man', 'GBP', 'Douglas', 'Europe'), (105, 'IN', 'India', 'INR', 'New Delhi', 'Asia'), (106, 'IO', 'British Indian Ocean Territory', 'USD', '', 'Asia'), (107, 'IQ', 'Iraq', 'IQD', 'Baghdad', 'Asia'), (108, 'IR', 'Iran', 'IRR', 'Tehran', 'Asia'), (109, 'IS', 'Iceland', 'ISK', 'Reykjavik', 'Europe'), (110, 'IT', 'Italy', 'EUR', 'Rome', 'Europe'), (111, 'JE', 'Jersey', 'GBP', 'Saint Helier', 'Europe'), (112, 'JM', 'Jamaica', 'JMD', 'Kingston', 'North America'), (113, 'JO', 'Jordan', 'JOD', 'Amman', 'Asia'), (114, 'JP', 'Japan', 'JPY', 'Tokyo', 'Asia'), (115, 'KE', 'Kenya', 'KES', 'Nairobi', 'Africa'), (116, 'KG', 'Kyrgyzstan', 'KGS', 'Bishkek', 'Asia'), (117, 'KH', 'Cambodia', 'KHR', 'Phnom Penh', 'Asia'), (118, 'KI', 'Kiribati', 'AUD', 'Tarawa', 'Oceania'), (119, 'KM', 'Comoros', 'KMF', 'Moroni', 'Africa'), (120, 'KN', 'Saint Kitts and Nevis', 'XCD', 'Basseterre', 'North America'), (121, 'KP', 'North Korea', 'KPW', 'Pyongyang', 'Asia'), (122, 'KR', 'South Korea', 'KRW', 'Seoul', 'Asia'), (123, 'KW', 'Kuwait', 'KWD', 'Kuwait City', 'Asia'), (124, 'KY', 'Cayman Islands', 'KYD', 'George Town', 'North America'), (125, 'KZ', 'Kazakhstan', 'KZT', 'Astana', 'Asia'), (126, 'LA', 'Laos', 'LAK', 'Vientiane', 'Asia'), (127, 'LB', 'Lebanon', 'LBP', 'Beirut', 'Asia'), (128, 'LC', 'Saint Lucia', 'XCD', 'Castries', 'North America'), (129, 'LI', 'Liechtenstein', 'CHF', 'Vaduz', 'Europe'), (130, 'LK', 'Sri Lanka', 'LKR', 'Colombo', 'Asia'), (131, 'LR', 'Liberia', 'LRD', 'Monrovia', 'Africa'), (132, 'LS', 'Lesotho', 'LSL', 'Maseru', 'Africa'), (133, 'LT', 'Lithuania', 'LTL', 'Vilnius', 'Europe'), (134, 'LU', 'Luxembourg', 'EUR', 'Luxembourg', 'Europe'), (135, 'LV', 'Latvia', 'EUR', 'Riga', 'Europe'), (136, 'LY', 'Libya', 'LYD', 'Tripoli', 'Africa'), (137, 'MA', 'Morocco', 'MAD', 'Rabat', 'Africa'), (138, 'MC', 'Monaco', 'EUR', 'Monaco', 'Europe'), (139, 'MD', 'Moldova', 'MDL', 'Chişinău', 'Europe'), (140, 'ME', 'Montenegro', 'EUR', 'Podgorica', 'Europe'), (141, 'MF', 'Saint Martin', 'EUR', 'Marigot', 'North America'), (142, 'MG', 'Madagascar', 'MGA', 'Antananarivo', 'Africa'), (143, 'MH', 'Marshall Islands', 'USD', 'Majuro', 'Oceania'), (144, 'MK', 'Macedonia', 'MKD', 'Skopje', 'Europe'), (145, 'ML', 'Mali', 'XOF', 'Bamako', 'Africa'), (146, 'MM', 'Myanmar [Burma]', 'MMK', 'Nay Pyi Taw', 'Asia'), (147, 'MN', 'Mongolia', 'MNT', 'Ulan Bator', 'Asia'), (148, 'MO', 'Macao', 'MOP', 'Macao', 'Asia'), (149, 'MP', 'Northern Mariana Islands', 'USD', 'Saipan', 'Oceania'), (150, 'MQ', 'Martinique', 'EUR', 'Fort-de-France', 'North America'), (151, 'MR', 'Mauritania', 'MRO', 'Nouakchott', 'Africa'), (152, 'MS', 'Montserrat', 'XCD', 'Plymouth', 'North America'), (153, 'MT', 'Malta', 'EUR', 'Valletta', 'Europe'), (154, 'MU', 'Mauritius', 'MUR', 'Port Louis', 'Africa'), (155, 'MV', 'Maldives', 'MVR', 'Malé', 'Asia'), (156, 'MW', 'Malawi', 'MWK', 'Lilongwe', 'Africa'), (157, 'MX', 'Mexico', 'MXN', 'Mexico City', 'North America'), (158, 'MY', 'Malaysia', 'MYR', 'Kuala Lumpur', 'Asia'), (159, 'MZ', 'Mozambique', 'MZN', 'Maputo', 'Africa'), (160, 'NA', 'Namibia', 'NAD', 'Windhoek', 'Africa'), (161, 'NC', 'New Caledonia', 'XPF', 'Noumea', 'Oceania'), (162, 'NE', 'Niger', 'XOF', 'Niamey', 'Africa'), (163, 'NF', 'Norfolk Island', 'AUD', 'Kingston', 'Oceania'), (164, 'NG', 'Nigeria', 'NGN', 'Abuja', 'Africa'), (165, 'NI', 'Nicaragua', 'NIO', 'Managua', 'North America'), (166, 'NL', 'Netherlands', 'EUR', 'Amsterdam', 'Europe'), (167, 'NO', 'Norway', 'NOK', 'Oslo', 'Europe'), (168, 'NP', 'Nepal', 'NPR', 'Kathmandu', 'Asia'), (169, 'NR', 'Nauru', 'AUD', '', 'Oceania'), (170, 'NU', 'Niue', 'NZD', 'Alofi', 'Oceania'), (171, 'NZ', 'New Zealand', 'NZD', 'Wellington', 'Oceania'), (172, 'OM', 'Oman', 'OMR', 'Muscat', 'Asia'), (173, 'PA', 'Panama', 'PAB', 'Panama City', 'North America'), (174, 'PE', 'Peru', 'PEN', 'Lima', 'South America'), (175, 'PF', 'French Polynesia', 'XPF', 'Papeete', 'Oceania'), (176, 'PG', 'Papua New Guinea', 'PGK', 'Port Moresby', 'Oceania'), (177, 'PH', 'Philippines', 'PHP', 'Manila', 'Asia'), (178, 'PK', 'Pakistan', 'PKR', 'Islamabad', 'Asia'), (179, 'PL', 'Poland', 'PLN', 'Warsaw', 'Europe'), (180, 'PM', 'Saint Pierre and Miquelon', 'EUR', 'Saint-Pierre', 'North America'), (181, 'PN', 'Pitcairn Islands', 'NZD', 'Adamstown', 'Oceania'), (182, 'PR', 'Puerto Rico', 'USD', 'San Juan', 'North America'), (183, 'PS', 'Palestine', 'ILS', '', 'Asia'), (184, 'PT', 'Portugal', 'EUR', 'Lisbon', 'Europe'), (185, 'PW', 'Palau', 'USD', 'Melekeok - Palau State Capital', 'Oceania'), (186, 'PY', 'Paraguay', 'PYG', 'Asunción', 'South America'), (187, 'QA', 'Qatar', 'QAR', 'Doha', 'Asia'), (188, 'RE', 'Réunion', 'EUR', 'Saint-Denis', 'Africa'), (189, 'RO', 'Romania', 'RON', 'Bucharest', 'Europe'), (190, 'RS', 'Serbia', 'RSD', 'Belgrade', 'Europe'), (191, 'RU', 'Russia', 'RUB', 'Moscow', 'Europe'), (192, 'RW', 'Rwanda', 'RWF', 'Kigali', 'Africa'), (193, 'SA', 'Saudi Arabia', 'SAR', 'Riyadh', 'Asia'), (194, 'SB', 'Solomon Islands', 'SBD', 'Honiara', 'Oceania'), (195, 'SC', 'Seychelles', 'SCR', 'Victoria', 'Africa'), (196, 'SD', 'Sudan', 'SDG', 'Khartoum', 'Africa'), (197, 'SE', 'Sweden', 'SEK', 'Stockholm', 'Europe'), (198, 'SG', 'Singapore', 'SGD', 'Singapore', 'Asia'), (199, 'SH', 'Saint Helena', 'SHP', 'Jamestown', 'Africa'), (200, 'SI', 'Slovenia', 'EUR', 'Ljubljana', 'Europe'), (201, 'SJ', 'Svalbard and Jan Mayen', 'NOK', 'Longyearbyen', 'Europe'), (202, 'SK', 'Slovakia', 'EUR', 'Bratislava', 'Europe'), (203, 'SL', 'Sierra Leone', 'SLL', 'Freetown', 'Africa'), (204, 'SM', 'San Marino', 'EUR', 'San Marino', 'Europe'), (205, 'SN', 'Senegal', 'XOF', 'Dakar', 'Africa'), (206, 'SO', 'Somalia', 'SOS', 'Mogadishu', 'Africa'), (207, 'SR', 'Suriname', 'SRD', 'Paramaribo', 'South America'), (208, 'SS', 'South Sudan', 'SSP', 'Juba', 'Africa'), (209, 'ST', 'São Tomé and Príncipe', 'STD', 'São Tomé', 'Africa'), (210, 'SV', 'El Salvador', 'USD', 'San Salvador', 'North America'), (211, 'SX', 'Sint Maarten', 'ANG', 'Philipsburg', 'North America'), (212, 'SY', 'Syria', 'SYP', 'Damascus', 'Asia'), (213, 'SZ', 'Swaziland', 'SZL', 'Mbabane', 'Africa'), (214, 'TC', 'Turks and Caicos Islands', 'USD', 'Cockburn Town', 'North America'), (215, 'TD', 'Chad', 'XAF', 'N''Djamena', 'Africa'), (216, 'TF', 'French Southern Territories', 'EUR', 'Port-aux-Français', 'Antarctica'), (217, 'TG', 'Togo', 'XOF', 'Lomé', 'Africa'), (218, 'TH', 'Thailand', 'THB', 'Bangkok', 'Asia'), (219, 'TJ', 'Tajikistan', 'TJS', 'Dushanbe', 'Asia'), (220, 'TK', 'Tokelau', 'NZD', '', 'Oceania'), (221, 'TL', 'East Timor', 'USD', 'Dili', 'Oceania'), (222, 'TM', 'Turkmenistan', 'TMT', 'Ashgabat', 'Asia'), (223, 'TN', 'Tunisia', 'TND', 'Tunis', 'Africa'), (224, 'TO', 'Tonga', 'TOP', 'Nuku''alofa', 'Oceania'), (225, 'TR', 'Turkey', 'TRY', 'Ankara', 'Asia'), (226, 'TT', 'Trinidad and Tobago', 'TTD', 'Port of Spain', 'North America'), (227, 'TV', 'Tuvalu', 'AUD', 'Funafuti', 'Oceania'), (228, 'TW', 'Taiwan', 'TWD', 'Taipei', 'Asia'), (229, 'TZ', 'Tanzania', 'TZS', 'Dodoma', 'Africa'), (230, 'UA', 'Ukraine', 'UAH', 'Kyiv', 'Europe'), (231, 'UG', 'Uganda', 'UGX', 'Kampala', 'Africa'), (232, 'UM', 'U.S. Minor Outlying Islands', 'USD', '', 'Oceania'), (233, 'US', 'United States', 'USD', 'Washington', 'North America'), (234, 'UY', 'Uruguay', 'UYU', 'Montevideo', 'South America'), (235, 'UZ', 'Uzbekistan', 'UZS', 'Tashkent', 'Asia'), (236, 'VA', 'Vatican City', 'EUR', 'Vatican', 'Europe'), (237, 'VC', 'Saint Vincent and the Grenadines', 'XCD', 'Kingstown', 'North America'), (238, 'VE', 'Venezuela', 'VEF', 'Caracas', 'South America'), (239, 'VG', 'British Virgin Islands', 'USD', 'Road Town', 'North America'), (240, 'VI', 'U.S. Virgin Islands', 'USD', 'Charlotte Amalie', 'North America'), (241, 'VN', 'Vietnam', 'VND', 'Hanoi', 'Asia'), (242, 'VU', 'Vanuatu', 'VUV', 'Port Vila', 'Oceania'), (243, 'WF', 'Wallis and Futuna', 'XPF', 'Mata-Utu', 'Oceania'), (244, 'WS', 'Samoa', 'WST', 'Apia', 'Oceania'), (245, 'XK', 'Kosovo', 'EUR', 'Pristina', 'Europe'), (246, 'YE', 'Yemen', 'YER', 'Sanaa', 'Asia'), (247, 'YT', 'Mayotte', 'EUR', 'Mamoutzou', 'Africa'), (248, 'ZA', 'South Africa', 'ZAR', 'Pretoria', 'Africa'), (249, 'ZM', 'Zambia', 'ZMW', 'Lusaka', 'Africa'), (250, 'ZW', 'Zimbabwe', 'ZWL', 'Harare', 'Africa');

-- -- Índices para tablas volcadas --

-- -- Indices de la tabla `countries` -- ALTER TABLE `countries` ADD PRIMARY KEY (`id`);

-- -- AUTO_INCREMENT de las tablas volcadas --

-- -- AUTO_INCREMENT de la tabla `countries` -- ALTER TABLE `countries` MODIFY `id` int(5) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=251; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

 Archivo HTML

El index.html, servirá para colocar un hipervínculo para poder realizar la descarga de nuestro reporte en Excel

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8" />
      <title>Reporte de excel con PHP y MySQL</title>
   </head>
   <body>
      <div>
        <h1>REPORTE DE EXCEL CON PHP Y MYSQL</h1>
         <div>
           <a href="exportar.php"> Generar reporte en Excel</a>
        </div>
      </div>
   </body>
</html>

 Archivo PHP

Finalmente crearemos nuestro archivo llamado exportar.php donde hemos colocado el código necesario para general el archivo excel. Explicaré que es lo que hace cada segmento de código a continuación

El siguiente código comprueba si se está accediento al archivo vía HTTP

if (PHP_SAPI == 'cli')
	die('Este ejemplo sólo se puede ejecutar desde un navegador Web');

Se inicia con el proceso de creación del reporte en excel

/** Incluye PHPExcel */
require_once dirname(__FILE__) . '/Classes/PHPExcel.php';
// Crear nuevo objeto PHPExcel
$objPHPExcel = new PHPExcel();

Colocamos la propiedades del documento

// Propiedades del documento
$objPHPExcel->getProperties()->setCreator("Obed Alvarado")
							 ->setLastModifiedBy("Obed Alvarado")
							 ->setTitle("Office 2010 XLSX Documento de prueba")
							 ->setSubject("Office 2010 XLSX Documento de prueba")
							 ->setDescription("Documento de prueba para Office 2010 XLSX, generado usando clases de PHP.")
							 ->setKeywords("office 2010 openxml php")
							 ->setCategory("Archivo con resultado de prueba");

Crearemos los encabezados que contendrá el reporte

// Combino las celdas desde A1 hasta E1
$objPHPExcel->setActiveSheetIndex(0)->mergeCells('A1:E1');

$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', 'REPORTE DE PAISES') ->setCellValue('A2', 'CODIGO') ->setCellValue('B2', 'NOMBRE') ->setCellValue('C2', 'MONEDA') ->setCellValue('D2', 'CAPITAL') ->setCellValue('E2', 'CONTINENTE');

// Fuente de la primera fila en negrita $boldArray = array('font' => array('bold' => true,),'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER));

$objPHPExcel->getActiveSheet()->getStyle('A1:E2')->applyFromArray($boldArray);

 

El ancho de una columna se puede ajustar mediante el siguiente código:

//Ancho de las columnas
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8);	
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(30);	
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);	
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);	
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);

Extraer los datos de MySQL

/*Extraer datos de MYSQL*/
	# conectare la base de datos
    $con=@mysqli_connect('localhost', 'root', 'root', 'test');
    if(!$con){
        die("imposible conectarse: ".mysqli_error($con));
    }
    if (@mysqli_connect_errno()) {
        die("Connect failed: ".mysqli_connect_errno()." : ". mysqli_connect_error());
    }
	$sql="SELECT * FROM countries  order by countryName";
	$query=mysqli_query($con,$sql);
	$cel=3;//Numero de fila donde empezara a crear  el reporte
	while ($row=mysqli_fetch_array($query)){
		$countryCode=$row['countryCode'];
		$countryName=$row['countryName'];
		$currencyCode=$row['currencyCode'];
		$capital=$row['capital'];
		$continentName=$row['continentName'];

$a="A".$cel; $b="B".$cel; $c="C".$cel; $d="D".$cel; $e="E".$cel; // Agregar datos $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($a, $countryCode) ->setCellValue($b, $countryName) ->setCellValue($c, $currencyCode) ->setCellValue($d, $capital) ->setCellValue($e, $continentName);

$cel+=1; }

/*Fin extracion de datos MYSQL*/

A continuación se procede a darle formato a la celdas

$rango="A2:$e";
$styleArray = array('font' => array( 'name' => 'Arial','size' => 10),
'borders'=>array('allborders'=>array('style'=> PHPExcel_Style_Border::BORDER_THIN,'color'=>array('argb' => 'FFF')))
);
$objPHPExcel->getActiveSheet()->getStyle($rango)->applyFromArray($styleArray);

Agregamos unos detalles más: nombre de la hoja de cálculo y activamos la primera hoja

// Cambiar el nombre de hoja de cálculo
$objPHPExcel->getActiveSheet()->setTitle('Reporte de paises');

// Establecer índice de hoja activa a la primera hoja , por lo que Excel abre esto como la primera hoja $objPHPExcel->setActiveSheetIndex(0);

Finalmente agregamos el código para que el usuario pueda descargar el archivo excel

// Redirigir la salida al navegador web de un cliente ( Excel5 )
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="reporte.xls"');
header('Cache-Control: max-age=0');
// Si usted está sirviendo a IE 9 , a continuación, puede ser necesaria la siguiente
header('Cache-Control: max-age=1');

// Si usted está sirviendo a IE a través de SSL , a continuación, puede ser necesaria la siguiente header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header ('Pragma: public'); // HTTP/1.0

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit;

Uniendolo todo:  a continuación se muestra como deberá de quedar el archivo exportar.php

<?php
if (PHP_SAPI == 'cli')
	die('Este ejemplo sólo se puede ejecutar desde un navegador Web');

/** Incluye PHPExcel */ require_once dirname(__FILE__) . '/Classes/PHPExcel.php'; // Crear nuevo objeto PHPExcel $objPHPExcel = new PHPExcel();

// Propiedades del documento $objPHPExcel->getProperties()->setCreator("Obed Alvarado") ->setLastModifiedBy("Obed Alvarado") ->setTitle("Office 2010 XLSX Documento de prueba") ->setSubject("Office 2010 XLSX Documento de prueba") ->setDescription("Documento de prueba para Office 2010 XLSX, generado usando clases de PHP.") ->setKeywords("office 2010 openxml php") ->setCategory("Archivo con resultado de prueba");

// Combino las celdas desde A1 hasta E1 $objPHPExcel->setActiveSheetIndex(0)->mergeCells('A1:E1');

$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', 'REPORTE DE PAISES') ->setCellValue('A2', 'CODIGO') ->setCellValue('B2', 'NOMBRE') ->setCellValue('C2', 'MONEDA') ->setCellValue('D2', 'CAPITAL') ->setCellValue('E2', 'CONTINENTE');

// Fuente de la primera fila en negrita $boldArray = array('font' => array('bold' => true,),'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER));

$objPHPExcel->getActiveSheet()->getStyle('A1:E2')->applyFromArray($boldArray);

//Ancho de las columnas $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(30); $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15); $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);

/*Extraer datos de MYSQL*/ # conectare la base de datos $con=@mysqli_connect('localhost', 'root', 'root', 'test'); if(!$con){ die("imposible conectarse: ".mysqli_error($con)); } if (@mysqli_connect_errno()) { die("Connect failed: ".mysqli_connect_errno()." : ". mysqli_connect_error()); } $sql="SELECT * FROM countries order by countryName"; $query=mysqli_query($con,$sql); $cel=3;//Numero de fila donde empezara a crear el reporte while ($row=mysqli_fetch_array($query)){ $countryCode=$row['countryCode']; $countryName=$row['countryName']; $currencyCode=$row['currencyCode']; $capital=$row['capital']; $continentName=$row['continentName'];

$a="A".$cel; $b="B".$cel; $c="C".$cel; $d="D".$cel; $e="E".$cel; // Agregar datos $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($a, $countryCode) ->setCellValue($b, $countryName) ->setCellValue($c, $currencyCode) ->setCellValue($d, $capital) ->setCellValue($e, $continentName);

$cel+=1; }

/*Fin extracion de datos MYSQL*/ $rango="A2:$e"; $styleArray = array('font' => array( 'name' => 'Arial','size' => 10), 'borders'=>array('allborders'=>array('style'=> PHPExcel_Style_Border::BORDER_THIN,'color'=>array('argb' => 'FFF'))) ); $objPHPExcel->getActiveSheet()->getStyle($rango)->applyFromArray($styleArray); // Cambiar el nombre de hoja de cálculo $objPHPExcel->getActiveSheet()->setTitle('Reporte de paises');

// Establecer índice de hoja activa a la primera hoja , por lo que Excel abre esto como la primera hoja $objPHPExcel->setActiveSheetIndex(0);

// Redirigir la salida al navegador web de un cliente ( Excel5 ) header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="reporte.xls"'); header('Cache-Control: max-age=0'); // Si usted está sirviendo a IE 9 , a continuación, puede ser necesaria la siguiente header('Cache-Control: max-age=1');

// Si usted está sirviendo a IE a través de SSL , a continuación, puede ser necesaria la siguiente header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header ('Pragma: public'); // HTTP/1.0

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit;

Con toda ésta información terminamos el tutorial, si el ejemplo te ha sido de utilidad, no olvides comentar :-)

DESCARGAR ARCHIVOS

 

Obed Alvarado

Sobre el autor

Artículo redactado por Obed Alvarado. Comparto experiencias prácticas sobre PHP, MySQL, aplicaciones web, instalación en hosting y herramientas para negocios.

Comentarios