Unable to open file as a workbook excel 97
Show older comments
I am attempting to import a list of .xls files and combine them. The issue is that the files were created in Excel 97-2003 and I have MATLAB version 2020b. Because of this, I get the following error:
Error using readtable (line 245)
Unable to open file '...12a.xls' as a
workbook. Check that the file exists, read access is available, and the file is a
valid spreadsheet file.
If I convert to a .txt file, the code can open the file and read it. The issue is when I convert from .xls to .txt, the .txt file combines all of the rows into one cell rendering the .txt file unusable. I believe this is caused because of the format of the .xls file.
I am curious if it is possible to read only certain rows and columns of the .xls file when converting to a .txt file to get rid of this issue or even to bypass needing the .txt file and somehow get MATLAB to read the .xls file properly.
For a better understanding, please run the following code on the attached files to see what I am speaking on (Look for the data values. The table is made properly on the first set of data. But on the second, things get weird. I want to only select the values listed out in the first data file and leave all the rest out as it is not important. Keep in mind that I have placed a bunch of 5's for confidentiality reasons, so disregard all of that.):
% Specify the desired path for the folder you want to operate on. You can
% simply copy and paste the directory from your file manager. Make sure to
% always add the '\' after the directory so the rest of the code knows
% where to start.
fileDir = '\';
% Import the raw data from the files in the directory
path_info = fullfile(fileDir, '*.xls');
files_temp = dir(path_info);
% Loop through each .out file, copy it and give new extension: .txt
for i = 1:numel(files_temp)
file = fullfile(fileDir, files_temp(i).name);
[tempDir, tempFile] = fileparts(file);
status = copyfile(file, fullfile(tempDir, [tempFile, '.txt']));
end
% Select all .txt files
path_info = fullfile(fileDir, '*.txt');
files = dir(path_info);
% Initialize parameters for the loop.
tables = [];
for i = 1:length(files)
% Read in the information from each data file and combine back into
% a single output file.
tables = readtable(files(i).name, 'VariableNamingRule', 'preserve');
tables
end
16 Comments
Mario Malic
on 13 Feb 2021
What happens if you open old Excel file and save it as new version, will it be readable by readtable? If yes, you can open the files with Excel through actxserver, and save them with newer format.
Steven Manz
on 13 Feb 2021
Edited: Steven Manz
on 13 Feb 2021
Mario Malic
on 13 Feb 2021
Edited: Mario Malic
on 13 Feb 2021
Here's an example of opening the file and saving it.
hExcel = actxserver('Excel.Application');
% hExcel.Visible = 1;
Workbooks = hExcel.Workbooks;
Workbook = Workbooks.Open("V22pw12a.xls");
Workbook.SaveAs('newfile.xlsx', 51); % It looks like format needs to be specified, without it, it won't be opened
Workbooks.Close;
% and so on
% Clean up
invoke(hExcel,'Quit');
delete(hExcel);
clear hExcel;
See here for the arguments in SaveAs methid, it allows you to specify the different formats for the file to be saved in.
Steven Manz
on 13 Feb 2021
Steven Manz
on 13 Feb 2021
Steven Manz
on 13 Feb 2021
Steven Manz
on 13 Feb 2021
Mario Malic
on 13 Feb 2021
I was editing to make sure it works as I haven't used Excel with actxserver before.
The error you mentioned occurs when you give command to the Excel window that is closed. If you close the instance of Excel that MATLAB has created, the one that you see when you set Visible property to on, you'll get that error.
files.SaveAs([extractBefore(Wkbk(i).name,'.') '.xlsx'],51);
% ^ the bracket was on incorrect spot
It is always better to use full path to the file when using SaveAs. You can use fileparts instead of extractBefore.
Steven Manz
on 15 Feb 2021
Edited: Steven Manz
on 15 Feb 2021
Mario Malic
on 15 Feb 2021
Save format 51 works fine, the issue is in save command. If you don't supply fullpath to it, it'll be saved in C:\Users\<username>\Documents
Your documents folder isn't on MATLAB path so it can't search for files there.
t = readtable('V22pw12a.xlsx');
>> head(t)
ans =
8×10 table
VB IB VG IG VD ID VSENSE RSENSE RAVE I1
__________ __ ____ _________ ________ __ ______ ______ _________ _________
{'-1.8' } 0 -1.8 -0.000114 -0.00048 0 -1.8 15800 {'20000'} {'5e-05'}
{'-1.4' } 0 -1.4 -8.05e-05 -0.00034 0 -1.4 17400 {'*' } {'*' }
% posting only two lines, will remove this after your reply
It's not the MATLAB who has the documentation on actxserver, it's the Microsoft. Use the Google to find the documentation, keywords: OLE Automation, activex . I am unable to find exact document with references.
Here are some links, but I am not super familiar with their documentation.
Steven Manz
on 15 Feb 2021
Steven Manz
on 15 Feb 2021
Mario Malic
on 15 Feb 2021
Edited: Mario Malic
on 15 Feb 2021
Here it is, not in its automated form, but you can convert to it easily.
hExcel = actxserver('Excel.Application');
Workbooks = hExcel.Workbooks;
Workbook = Workbooks.Open("C:\Users\Mario\Downloads\V22pw11a.xls");
Workbook.SaveAs("C:\Users\Mario\Downloads\V22pw12a.xlsx", 51); % It looks like format needs to be specified, without it, it won't be opened
Workbooks.Close;
t = readtable("C:\Users\Mario\Downloads\V22pw12a.xlsx");
t =
10×2 table
VB IB
______ __
-1.8 0
-1.4 0
Steven Manz
on 15 Feb 2021
Mario Malic
on 15 Feb 2021
wkbk = [name '.xlsx']; % the output of this is below
wkbk = 'V22pw14a.xlsx'
This is the error, wkbk is not the full path to the file.
If you don't provide fullpath to the file you want to save, your file will be saved in C:\Users\<username>\Documents as mentioned in the comment above. If you go there, you'll see your file and if you use readtable on it, it'll work properly.
Better alternative for constructing the full path to files
[filepath, name, ext] = fileparts(files(1).name);
fullFilePath = fullfile(filepath, strcat(name, ext));
wkbk = 'C:\...\...\V22pw14a.xlsx' % this is how wkbk should look like
Steven Manz
on 15 Feb 2021
Accepted Answer
More Answers (1)
Jeremy Hughes
on 14 Feb 2021
I tried opening one of your files in a hex editor, and it's not an excel file. It's a text file.
What clued me in was a warning when I tried to open the file with Excel.
How were these created?
BTW, this works:
T = readtable('V22pw12a.xls','FileType','text')
3 Comments
Steven Manz
on 14 Feb 2021
Steven Manz
on 15 Feb 2021
Jeremy Hughes
on 16 Feb 2021
Open the file in a text editor and you can see it's actually a tab delimited text file--the tool generating it is just labeling it .xls, but that's not what it is. I think the reason activeX is working is because that just opens Excel in the background and Excel is transforming the file. You could do this with readcell/writecell pretty easily.
C = readcell('V22pw12a.xls','FileType','text','Delimiter','\t')
writecell(C,'V22pw12a.xlsx')
But you don't really need to you. These read functions accept range for textfiles as well.
A1 = readmatrix('V22pw12a.xls','FileType','text','Delimiter','\t','Range','A39:J48')
A2 = readmatrix('V22pw12a.xls','FileType','text','Delimiter','\t','Range','A85:J89')
Categories
Find more on Spreadsheets in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!