There are several options.
If the data you are printing is accessible by column, you can set up Text Blocks or Field Blocks for each column. Then you can enter the data simply column by column. This may be what you are doing already.
Another option is more in your software, setting up a table and controlling the x,y values of each cell. These would be entered as separate fields with the ^FT command.
The third option is handling each row as a separate label. You have to keep track and make sure you aren't going to print off the end of the label. Each row would look like: ^XA^MNN^LL(line height)^FO0,0^FDcol1 data^FS^FO20,0^FDcol 2 data^FO40,0^FDcol3 data^FO60,0^FDcol4 data^XZ
The last row would need to have ^XA^MNY^FO0,0^FD... ^XZ in order for it to properly handle the gaps between the labels.
Hope that helps,Robin