Question

Perl program to add 3 columns to an existing excel file and generate random values

Asked by: dchid

I have just started to learn perl so I am a complete novice.
I have a basic excel table(which will be exported to mySQL eventually).

At the moment the table has columns for title,author, description, category and imageurl.
I would like a perl program which would take the existing .xls file, open it, and add 3 new columns called ID, Price, and Currentstock, and to have each of these columns populated with random numerical (1-9999 for ID, 1-50 for Price, and 0-200 for Currentstock) for each title listed in the title column.

I hope I have explained clearly, and thanks for your help.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2007-11-20 at 12:24:15ID22973775
Tags

perl

,

excel

,

column

,

add

,

file

Topic

Perl Programming Language

Participating Experts
1
Points
250
Comments
32

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Perl and MySQL
    I want to use MySQL with Perl but I have a problem. I downloaded a module mysql.pm and tried to use it like that: use DBI; ... ... $dbh = DBI->connect($dsn, $user, $password); ... but I got an error message "Can't find DBI" or something li...
  2. Perl and Mysql
    Actually im just a beginner I just learned recently about basic perl and mysql, but I couln't find a tutorial site using perl & mysql manipulation. Cause I would like to make a website which the guest can write comments and display it, on how many users visited the site....
  3. perl/cgi
    where to learn databse connectivity using perl? Any good book pl recommend and tell where to buy?
  4. Perl books for a novice !!
    I am a complete novice programmer who is just embarking on his first job. Can anyone please recommend any books / web sites that may be able to help get me started?

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: Adam314Posted on 2007-11-20 at 13:01:20ID: 20323189

What OS will this be running on?  If windows: Is Excel installed on the computer?

 

by: dchidPosted on 2007-11-20 at 13:06:52ID: 20323228

At the moment I am working on XP/Vista, Perl is installed on this system as is Excel 2007.
I also have access to UNIX although this is limted and not available at present.

 

by: Adam314Posted on 2007-11-20 at 13:38:01ID: 20323505

This assumes there are titles in row 1, and the data begins on row 2.  Also, that title is in column A, and that ID, Price, and Currentstock will be going into columns F, G, and H, respectively.

You should make a backup of your data first, in case this doesn't work as you want it to.

#!/usr/bin/perl -w
use strict;
use OLE;
 
my $xl_app = CreateObject OLE 'Excel.Application' || die $!;
$xl_app->{'Visible'} = 0;
my $workbook = $xl_app->Workbooks->Open('/temp_ee/test1.xls');
my $worksheet = $workbook->Worksheets(1);
 
$worksheet->Range("F1")->{Value} = 'ID';
$worksheet->Range("G1")->{Value} = 'Price';
$worksheet->Range("H1")->{Value} = 'Currentstock';
 
my $currow=2;
while($worksheet->Range("A$currow")->{Value}) {
	$worksheet->Range("F$currow")->{Value} = int(rand(9999)+1);
	$worksheet->Range("G$currow")->{Value} = int(rand(50)+1);
	$worksheet->Range("H$currow")->{Value} = int(rand(201));
	$currow++;
}
 
$workbook->Save();
 
$xl_app->ActiveWorkbook->Close(0);
$xl_app->Quit();
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

Select allOpen in new window

 

by: dchidPosted on 2007-11-20 at 13:56:41ID: 20323652

Thank you for that, although I have not got it working, Its probably something simple, I am currently getting the error
Can't call method "worksheets" on an undefined value at C:\.(path)\test.pl line 8

Sorry this is probably to with me being clueless at the moment for the most part when it comes to Perl.

 

by: Adam314Posted on 2007-11-20 at 14:40:16ID: 20323964

What do you have on line 7?
Did you update it to have the path to your file?

 

by: dchidPosted on 2007-11-20 at 14:46:52ID: 20324006

line 7 has been updated to the path to my workbook
my $workbook = $xl_app->Workbooks->Open('/book1.xls');

 

by: Adam314Posted on 2007-11-20 at 14:54:46ID: 20324060

Is that the correct path?

Replace line 7 with this:
my $workbook = $xl_app->Workbooks->Open('/temp_ee/test1.xls') or die "Could not open workbook: $!\n";

 

by: dchidPosted on 2007-11-20 at 14:56:25ID: 20324068

This is the full code used, I changed the path of workbook and the columns in which data will be generated

#!/usr/bin/perl -w
use strict;
use OLE;
 
my $xl_app = CreateObject OLE 'Excel.Application' || die $!;
$xl_app->{'Visible'} = 0;
my $workbook = $xl_app->Workbooks->Open('/book1.xls');
my $worksheet = $workbook->Worksheets(1);
 
$worksheet->Range("A1")->{Value} = 'ID';
$worksheet->Range("I1")->{Value} = 'Price';
$worksheet->Range("H1")->{Value} = 'Currentstock';
 
my $currow=2;
while($worksheet->Range("B$currow")->{Value}) {
	$worksheet->Range("A$currow")->{Value} = int(rand(9999)+1);
	$worksheet->Range("I$currow")->{Value} = int(rand(50)+1);
	$worksheet->Range("H$currow")->{Value} = int(rand(201));
	$currow++;
}
 
$workbook->Save();
 
$xl_app->ActiveWorkbook->Close(0);
$xl_app->Quit();

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

Select allOpen in new window

 

by: dchidPosted on 2007-11-20 at 14:59:43ID: 20324089

I replaced the line, and it is telling me it could not open workbook
The workbook is currently in the same directory as the perl program, does it need to be in a seperate directory?

 

by: Adam314Posted on 2007-11-21 at 07:03:18ID: 20328128

If it is in the same directory, don't put a slash before the filename.

Line 7 should be:
my $workbook = $xl_app->Workbooks->Open('book1.xls') or die "Could not open workbook: $!\n";

 

by: dchidPosted on 2007-11-21 at 07:42:27ID: 20328448

Hi, thanks I tried that, but still it tells me it could not open workbook, I am not sure why, I have checked file permissions etc and see can think of nothing which should prevent workbook from being opened

 

by: Adam314Posted on 2007-11-21 at 07:56:11ID: 20328586

Did you add the "or die" part to line 7?  What message do you get when you run it?

 

by: dchidPosted on 2007-11-21 at 08:21:55ID: 20328807

yes the or die has been added, the message i get when i try to run it is could not open workbook.
I tried a different perl program, which opens up, creates a new workbook and adds some values, this worked fine, although this does not help me, for some reason the existing workbook is unable to be opened by the perl program.

 

by: Adam314Posted on 2007-11-21 at 09:07:06ID: 20329184

Try this:


....
my $FileName = 'book1.xls';      #NOTE: This line is new
my $xl_app = CreateObject OLE 'Excel.Application' || die $!;
$xl_app->{'Visible'} = 0;
die "File does not exist, or is not readable\n" unless -r $FileName;     #NOTE: This line is new
my $workbook = $xl_app->Workbooks->Open($FileName)    #NOTE: This line is changed
    or die "Could not open workbook: $!\n";    #NOTE: This line is new
my $worksheet = $workbook->Worksheets(1);
...

 

by: dchidPosted on 2007-11-21 at 15:50:51ID: 20331927

Thank you for trying to sort this problem, I entered the new code and same problem, could not open workbook.
I think your code is fine, and this may be an issue on my laptop, possibly with vista, although i have checked permissions.

 

by: dchidPosted on 2007-11-21 at 16:16:50ID: 20331996

I transferred the files to XP and still same problem of not being able to open the workbook

 

by: Adam314Posted on 2007-11-26 at 08:04:15ID: 20350753

Can you open the file in excel?

 

by: dchidPosted on 2007-11-26 at 08:16:42ID: 20350857

The file opens no problem in excel on XP or Vista
I tried to make a new file, same name, but same problem exists that the perl program can not open workbook. I have tried it on 3 different computers, 1 running Vista, 2 running XP Professional, really has confused me.

 

by: Adam314Posted on 2007-11-26 at 08:38:35ID: 20351016

Did you make the change I suggested in post 20329184?  
With that change, does anything different happen?
What is the exact error message you get?

 

by: dchidPosted on 2007-11-26 at 10:00:47ID: 20351602

That change has been made and the line is still could not open workbook

 

by: Adam314Posted on 2007-11-26 at 10:25:00ID: 20351801

Try using the full path to the file:

my $FileName = 'c:\path\to\your\file\book1.xls';
...
my $workbook = $xl_app->Workbooks->Open($FileName)    #NOTE: This line is changed
    or die "Could not open workbook: $!\n";    #NOTE: This line is new

 

by: dchidPosted on 2007-11-26 at 11:36:12ID: 20352339

Still the same problem, thank you for your continuing efforts to help with this problem

 

by: Adam314Posted on 2007-11-26 at 12:37:23ID: 20352806

After the "Could not open workbook", is there anything else displayed?

 

by: Adam314Posted on 2007-11-26 at 12:43:26ID: 20352855

Try with this minor change also:

my $workbook = $xl_app->Workbooks->Open($FileName)
    or die "Could not open workbook:\n  $!\n  $@\n";

 

by: dchidPosted on 2007-11-26 at 13:03:33ID: 20353052

The only message is Could not open Workbook.
With the new change do I need to add a value to $FileName before trying to run the program?

 

by: Adam314Posted on 2007-11-26 at 13:06:44ID: 20353076

Yes, set filename like so:
my $FileName = 'c:\path\to\your\file\book1.xls';

 

by: dchidPosted on 2007-11-26 at 13:49:33ID: 20353482

Same as before "Could not open workbook:"

 

by: Adam314Posted on 2007-11-26 at 14:09:11ID: 20353631

Here is another change...


#!/usr/bin/perl -w
use strict;
use OLE;
 
my $FileName = 'c:\path\to\files\book1.xls';
my $xl_app = CreateObject OLE 'Excel.Application' || die "Could not create app: $!";
$xl_app->{'Visible'} = 0;
die "File does not exist, or is not readable\n" unless -r $FileName;
my $workbook = $xl_app->Workbooks->Open($FileName);
if($workbook) {
    print "Workbook is created\n";
}
else {
    print "Workbook NOT created:\n  $!\n  $@\n";
}
my $worksheet = $workbook->Worksheets(1);
 
$worksheet->Range("F1")->{Value} = 'ID';
$worksheet->Range("G1")->{Value} = 'Price';
$worksheet->Range("H1")->{Value} = 'Currentstock';
 
my $currow=2;
while($worksheet->Range("A$currow")->{Value}) {
      $worksheet->Range("F$currow")->{Value} = int(rand(9999)+1);
      $worksheet->Range("G$currow")->{Value} = int(rand(50)+1);
      $worksheet->Range("H$currow")->{Value} = int(rand(201));
      $currow++;
}
 
$workbook->Save();
 
$xl_app->ActiveWorkbook->Close(0);
$xl_app->Quit();

 

by: dchidPosted on 2007-11-26 at 14:20:40ID: 20353730

new message is workbook is created although the workbook still has not been altered after running the program

 

by: Adam314Posted on 2007-11-26 at 14:38:57ID: 20353900

What is the output from this:

...
my $worksheet = $workbook->Worksheets(1);
print "A1 = " . $worksheet->Range("A1") . "\n";
print "B1 = " . $worksheet->Range("B1") . "\n";
print "A2 = " . $worksheet->Range("A2") . "\n";
print "B2 = " . $worksheet->Range("B2") . "\n";

Are those values what is actually in the worksheet?

 

by: dchidPosted on 2007-11-26 at 14:54:24ID: 20353989

I ran the code again, and it has worked. I am not sure what you changed in post 20353631 but it seems to of done the trick.
Thank you very much for your patience and help, really appreciated.

 

by: Adam314Posted on 2007-11-26 at 15:35:50ID: 20354229

I'm glad it's working... I was running out of ideas to try.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...