8#include "tpcclibConfig.h"
22static char *info[] = {
23 "Save TAC data in Excel compatible XML format. Each TAC file will have",
24 "its own sheet in the XML file.",
25 "TAC files may contain variable number of TACs and samples.",
27 "Usage: @P [options] outputfile tacfiles",
31 " Frame mid times are always used instead of frame start and end times.",
34 "See also: tacformat, tacjoin, tacblend, tacadd, tacunit, tacnames",
36 "Keywords: TAC, tool, format, Excel, XML, plotting",
68 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
69 if(verbose>0) printf(
"%s(%s)\n", __func__, sheetname);
79 char tunit[128], cunit[128];
84 if(verbose>2) printf(
"constructing TAC names\n");
90 n=fprintf(fp,
" <ss:Worksheet ss:Name=\"%s\">\n", sheetname);
91 n+=fprintf(fp,
" <ss:Table>\n");
103 for(
int i=0; i<n; i++) fprintf(fp,
" <ss:Column ss:Width=\"80\"/>\n");
107 fprintf(fp,
" <ss:Row ss:StyleID=\"1\">\n");
109 fprintf(fp,
" <ss:Cell>\n");
110 fprintf(fp,
" <ss:Data ss:Type=\"String\">time[%s]</ss:Data>\n", tunit);
111 fprintf(fp,
" </ss:Cell>\n");
113 fprintf(fp,
" <ss:Cell>\n");
114 fprintf(fp,
" <ss:Data ss:Type=\"String\">start[%s]</ss:Data>\n", tunit);
115 fprintf(fp,
" </ss:Cell>\n");
116 fprintf(fp,
" <ss:Cell>\n");
117 fprintf(fp,
" <ss:Data ss:Type=\"String\">end[%s]</ss:Data>\n", cunit);
118 fprintf(fp,
" </ss:Cell>\n");
120 for(
int ri=0; ri<tac->
tacNr; ri++) {
122 fprintf(fp,
" <ss:Cell>\n");
124 fprintf(fp,
" <ss:Data ss:Type=\"String\">%s[%s]</ss:Data>\n", tac->
c[ri].
name, cunit);
126 fprintf(fp,
" <ss:Data ss:Type=\"String\">%s</ss:Data>\n", tac->
c[ri].
name);
127 fprintf(fp,
" </ss:Cell>\n");
130 fprintf(fp,
" <ss:Cell>\n");
131 fprintf(fp,
" <ss:Data ss:Type=\"String\">weight</ss:Data>\n");
132 fprintf(fp,
" </ss:Cell>\n");
134 if(fprintf(fp,
" </ss:Row>\n")<1) {
140 if(verbose>2) printf(
"writing data table\n");
141 for(
int fi=0; fi<tac->
sampleNr; fi++) {
143 fprintf(fp,
" <ss:Row>\n");
149 double v;
if(tac->
isframe==0) v=tac->
x[fi];
else v=tac->
x1[fi];
150 fprintf(fp,
" <ss:Cell>\n");
151 if(isnan(v)) fprintf(fp,
" <ss:Data ss:Type=\"String\"></ss:Data>\n");
152 else fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", v);
153 fprintf(fp,
" </ss:Cell>\n");
157 fprintf(fp,
" <ss:Cell>\n");
158 if(isnan(v)) fprintf(fp,
" <ss:Data ss:Type=\"String\"></ss:Data>\n");
159 else fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", v);
160 fprintf(fp,
" </ss:Cell>\n");
164 for(
int ri=0; ri<tac->
tacNr; ri++) {
165 fprintf(fp,
" <ss:Cell>\n");
166 if(isnan(tac->
c[ri].
y[fi])) fprintf(fp,
" <ss:Data ss:Type=\"String\"></ss:Data>\n");
167 else fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", tac->
c[ri].
y[fi]);
168 fprintf(fp,
" </ss:Cell>\n");
173 fprintf(fp,
" <ss:Cell>\n");
174 if(isnan(tac->
w[fi])) fprintf(fp,
" <ss:Data ss:Type=\"String\"></ss:Data>\n");
175 else fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", tac->
w[fi]);
176 fprintf(fp,
" </ss:Cell>\n");
179 fprintf(fp,
" </ss:Row>\n");
183 fprintf(fp,
" </ss:Table>\n");
184 if(fprintf(fp,
" </ss:Worksheet>\n")<1) {
199int main(
int argc,
char **argv)
201 int ai, help=0, version=0, verbose=1;
203 char tacfile[FILENAME_MAX], outfile[FILENAME_MAX];
204 int fileNr=0, file1=0;
210 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
211 tacfile[0]=outfile[0]=(char)0;
213 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
215 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
216 if(strncasecmp(cptr,
"MIDDLE", 3)==0) {
217 mid_time=1;
continue;
219 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
228 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
233 if(ai<argc)
strlcpy(outfile, argv[ai++], FILENAME_MAX);
234 for(; ai<argc; ai++) {
235 if(fileNr==0) file1=ai;
242 for(ai=0; ai<argc; ai++) printf(
"%s ", argv[ai]);
244 printf(
"fileNr := %d\n", fileNr);
245 printf(
"outfile := %s\n", outfile);
246 printf(
"mid_time := %d\n", mid_time);
251 if(!outfile[0]) {
tpcPrintUsage(argv[0], info, stdout);
return(1);}
253 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
261 if(strcasecmp(cptr,
".XML")) {
262 fprintf(stderr,
"Error: output file name extension must be .xml\n");
267 for(ai=file1; ai<argc; ai++) {
268 strlcpy(tacfile, argv[ai], FILENAME_MAX);
269 if(access(tacfile, 0) == -1) {
270 fprintf(stderr,
"Error: input file %s does not exist.\n", tacfile);
273 if(strcasecmp(outfile, tacfile)==0) {
274 fprintf(stderr,
"Error: input file would be overwritten.\n");
283 if(verbose>1) printf(
"opening %s\n", outfile);
284 FILE *fp; fp=fopen(outfile,
"w");
286 fprintf(stderr,
"Error: cannot open file for writing.\n");
291 int n=fprintf(fp,
"<?xml version=\"1.0\"?>\n");
293 fprintf(stderr,
"Error: cannot write file.\n");
294 fclose(fp);
return(12);
296 fprintf(fp,
"<ss:Workbook xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\n");
297 fprintf(fp,
" <ss:Styles>\n");
298 fprintf(fp,
" <ss:Style ss:ID=\"1\">\n");
299 fprintf(fp,
" <ss:Font ss:Bold=\"1\"/>\n");
300 fprintf(fp,
" </ss:Style>\n");
301 fprintf(fp,
" </ss:Styles>\n");
308 for(ai=file1; ai<argc; ai++) {
309 strlcpy(tacfile, argv[ai], FILENAME_MAX);
310 if(verbose>1) {printf(
"%s\n", tacfile); fflush(stdout);}
314 if(verbose<=1) {printf(
"%s\n", tacfile); fflush(stdout);}
316 tacFree(&tac); errorCounter++;
break;
320 printf(
"tacNr := %d\n", tac.
tacNr);
321 printf(
"sampleNr := %d\n", tac.
sampleNr);
328 char sheetname[FILENAME_MAX]; strcpy(sheetname, tacfile);
335 tacFree(&tac); errorCounter++;
break;
341 if(errorCounter==0) {
342 int n=fprintf(fp,
"</ss:Workbook>\n");
344 fprintf(stderr,
"Error: cannot write file.\n");
359 printf(
"Contents of %d TAC files stored in %s\n", fileNr, outfile);
char * filenameGetExtension(const char *s)
Get the last extension of a file name.
void filenameRmPath(char *s)
void filenameRmExtensions(char *s)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacWriteSheetIntoXML(TAC *tac, char *sheetname, FILE *fp, TPCSTATUS *status)
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
char * tacFormattxt(tacformat c)
void tacEnsureNames(TAC *tac)
int tacIsWeighted(TAC *tac)
Header file for library libtpcextensions.
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_CANNOT_WRITE
Cannot write file.
char * unitName(int unit_code)
Header file for library libtpcift.
Header file for library libtpctac.