33 {
34 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
35 if(verbose>0) printf("%s()\n", __func__);
36 if(fp==NULL) {
39 }
43 }
44
45 char *cptr, tunit[128], cunit[128];
46 int n;
47
48
54
56 if(cptr!=NULL) {*cptr='c'; cptr++; *cptr='c';}
57 }
58
59
60 if(verbose>2) printf("constructing TAC names\n");
62
63
64 n=fprintf(fp, "<?xml version=\"1.0\"?>\n");
65 if(n<1) {
68 }
69 fprintf(fp, "<ss:Workbook xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\n");
70 fprintf(fp, " <ss:Styles>\n");
71 fprintf(fp, " <ss:Style ss:ID=\"1\">\n");
72 fprintf(fp, " <ss:Font ss:Bold=\"1\"/>\n");
73 fprintf(fp, " </ss:Style>\n");
74 fprintf(fp, " </ss:Styles>\n");
75 fprintf(fp, " <ss:Worksheet ss:Name=\"Sheet1\">\n");
76 fprintf(fp, " <ss:Table>\n");
77
78
82 for(int i=0; i<n; i++) fprintf(fp, " <ss:Column ss:Width=\"80\"/>\n");
83
84
85 fprintf(fp, " <ss:Row ss:StyleID=\"1\">\n");
87 fprintf(fp, " <ss:Cell>\n");
88 fprintf(fp, " <ss:Data ss:Type=\"String\">time[%s]</ss:Data>\n", tunit);
89 fprintf(fp, " </ss:Cell>\n");
90 } else {
91 fprintf(fp, " <ss:Cell>\n");
92 fprintf(fp, " <ss:Data ss:Type=\"String\">start[%s]</ss:Data>\n", tunit);
93 fprintf(fp, " </ss:Cell>\n");
94 fprintf(fp, " <ss:Cell>\n");
95 fprintf(fp, " <ss:Data ss:Type=\"String\">end[%s]</ss:Data>\n", cunit);
96 fprintf(fp, " </ss:Cell>\n");
97 }
98 for(
int ri=0; ri<tac->
tacNr; ri++) {
99
100 char *nptr=tac->
c[ri].
name;
102 if(senc!=NULL) nptr=senc;
103 fprintf(fp, " <ss:Cell>\n");
105 fprintf(fp, " <ss:Data ss:Type=\"String\">%s[%s]</ss:Data>\n", nptr, cunit);
106 else
107 fprintf(fp, " <ss:Data ss:Type=\"String\">%s</ss:Data>\n", nptr);
108 fprintf(fp, " </ss:Cell>\n");
109 if(senc!=NULL) free(senc);
110 }
112 fprintf(fp, " <ss:Cell>\n");
113 fprintf(fp, " <ss:Data ss:Type=\"String\">weight</ss:Data>\n");
114 fprintf(fp, " </ss:Cell>\n");
115 }
116 n=fprintf(fp, " </ss:Row>\n");
117 if(n<1) {
120 }
121
122
123 if(verbose>2) printf("writing data table\n");
124 for(
int fi=0; fi<tac->
sampleNr; fi++) {
125
126 fprintf(fp, " <ss:Row>\n");
127
128
129
130
131
132 double v;
if(tac->
isframe==0) v=tac->
x[fi];
else v=tac->
x1[fi];
133 fprintf(fp, " <ss:Cell>\n");
134 if(isnan(v)) fprintf(fp, " <ss:Data ss:Type=\"String\"></ss:Data>\n");
135 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", v);
136 fprintf(fp, " </ss:Cell>\n");
137
140 fprintf(fp, " <ss:Cell>\n");
141 if(isnan(v)) fprintf(fp, " <ss:Data ss:Type=\"String\"></ss:Data>\n");
142 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", v);
143 fprintf(fp, " </ss:Cell>\n");
144 }
145
146
147 for(
int ri=0; ri<tac->
tacNr; ri++) {
148 fprintf(fp, " <ss:Cell>\n");
149 if(isnan(tac->
c[ri].
y[fi])) fprintf(fp,
" <ss:Data ss:Type=\"String\"></ss:Data>\n");
150 else fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", tac->
c[ri].
y[fi]);
151 fprintf(fp, " </ss:Cell>\n");
152 }
153
154
156 fprintf(fp, " <ss:Cell>\n");
157 if(isnan(tac->
w[fi])) fprintf(fp,
" <ss:Data ss:Type=\"String\"></ss:Data>\n");
158 else fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", tac->
w[fi]);
159 fprintf(fp, " </ss:Cell>\n");
160 }
161
162 fprintf(fp, " </ss:Row>\n");
163 }
164
165
166 fprintf(fp, " </ss:Table>\n");
167 fprintf(fp, " </ss:Worksheet>\n");
168 n=fprintf(fp, "</ss:Workbook>\n");
169 if(n<1) {
172 }
173
176}
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
char * strEncodeForXML(const char *s)
char * strcasestr(const char *haystack, const char *needle)
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
void tacEnsureNames(TAC *tac)
int tacIsWeighted(TAC *tac)
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_CANNOT_WRITE
Cannot write file.
char * unitName(int unit_code)